* [RFC PATCH 001/134] qom: Introduce object_new_child()
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
@ 2026-07-11 22:34 ` Alexander Graf
2026-07-13 8:47 ` Daniel P. Berrangé
2026-07-13 16:49 ` Richard Henderson
2026-07-11 22:34 ` [RFC PATCH 002/134] qdev: Rename qdev_new()/qdev_try_new() to *_orphan() Alexander Graf
` (133 subsequent siblings)
134 siblings, 2 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:34 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
We already have two ways of creating a QOM object with a parent set
from birth: object_initialize_child() for objects embedded in the
parent struct, and object_new_with_props() for heap-allocated objects
that also want a list of string properties applied. What we do not
have is the plain heap-allocated dual of object_initialize_child():
create the object, add it as a child<> of a given parent under a given
name, and hand the reference to the parent.
Board and composite-device code that heap-allocates children today
therefore either open-codes object_new()+object_property_add_child()
+object_unref(), or skips the parenting step entirely and lets
device_set_realized() dump the object into /machine/unattached.
Add object_new_child(parent, id, typename) as that missing primitive.
The reference created by object_new() is transferred to the parent's
child<> property, so on return the sole reference is held by @parent
and the caller does not need to unref. Later patches build the qdev
and per-bus creation helpers on top of this.
Suggested-by: Markus Armbruster <armbru@redhat.com>
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
include/qom/object.h | 25 +++++++++++++++++++++++++
qom/object.c | 13 +++++++++++++
2 files changed, 38 insertions(+)
diff --git a/include/qom/object.h b/include/qom/object.h
index 11f55613fc..ce6a23b5a1 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -632,6 +632,31 @@ Object *object_new_with_class(ObjectClass *klass);
*/
Object *object_new(const char *typename);
+/**
+ * object_new_child:
+ * @parent: the QOM composition-tree parent
+ * @id: the child<> property name; the object's canonical QOM path
+ * becomes @parent's path plus "/" plus @id
+ * @typename: the name of the type of the object to instantiate
+ *
+ * Create a heap-allocated object and immediately add it to the QOM
+ * composition tree as a child of @parent.
+ *
+ * This is the heap-allocated dual of object_initialize_child(): use
+ * this when the child is a pointer member of the parent, and use
+ * object_initialize_child() when the child is embedded in the parent
+ * struct. See also object_new_with_props() for the variant that
+ * additionally sets a list of properties.
+ *
+ * The reference returned by object_new() is transferred to the child<>
+ * property of @parent, so the object has a reference count of 1 held
+ * by @parent, and the caller does not need to unref.
+ *
+ * Returns: the newly allocated, instantiated and parented object.
+ */
+Object *object_new_child(Object *parent, const char *id,
+ const char *typename);
+
/**
* object_new_with_props:
* @typename: The name of the type of the object to instantiate.
diff --git a/qom/object.c b/qom/object.c
index f79b2cf361..b4d181b617 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -718,6 +718,19 @@ Object *object_new(const char *typename)
return object_new_with_type(ti);
}
+Object *object_new_child(Object *parent, const char *id,
+ const char *typename)
+{
+ Object *obj;
+
+ g_assert(parent);
+ g_assert(id);
+
+ obj = object_new(typename);
+ object_property_add_child(parent, id, obj);
+ object_unref(obj);
+ return obj;
+}
Object *object_new_with_props(const char *typename,
Object *parent,
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 001/134] qom: Introduce object_new_child()
2026-07-11 22:34 ` [RFC PATCH 001/134] qom: Introduce object_new_child() Alexander Graf
@ 2026-07-13 8:47 ` Daniel P. Berrangé
2026-07-13 9:01 ` Graf (AWS), Alexander
2026-07-13 16:49 ` Richard Henderson
1 sibling, 1 reply; 156+ messages in thread
From: Daniel P. Berrangé @ 2026-07-13 8:47 UTC (permalink / raw)
To: Alexander Graf
Cc: qemu-devel, qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu
On Sat, Jul 11, 2026 at 10:34:54PM +0000, Alexander Graf wrote:
> We already have two ways of creating a QOM object with a parent set
> from birth: object_initialize_child() for objects embedded in the
> parent struct, and object_new_with_props() for heap-allocated objects
> that also want a list of string properties applied. What we do not
> have is the plain heap-allocated dual of object_initialize_child():
> create the object, add it as a child<> of a given parent under a given
> name, and hand the reference to the parent.
>
> Board and composite-device code that heap-allocates children today
> therefore either open-codes object_new()+object_property_add_child()
> +object_unref(), or skips the parenting step entirely and lets
> device_set_realized() dump the object into /machine/unattached.
>
> Add object_new_child(parent, id, typename) as that missing primitive.
> The reference created by object_new() is transferred to the parent's
> child<> property, so on return the sole reference is held by @parent
> and the caller does not need to unref. Later patches build the qdev
> and per-bus creation helpers on top of this.
>
> Suggested-by: Markus Armbruster <armbru@redhat.com>
> Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
> Assisted-by: Kiro
QEMU does not currently permit contributions assisted by AI
coding tools.
There is an open discussion about altering the policy but that
is not conclude with agreement yet.
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> include/qom/object.h | 25 +++++++++++++++++++++++++
> qom/object.c | 13 +++++++++++++
> 2 files changed, 38 insertions(+)
>
> diff --git a/include/qom/object.h b/include/qom/object.h
> index 11f55613fc..ce6a23b5a1 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -632,6 +632,31 @@ Object *object_new_with_class(ObjectClass *klass);
> */
> Object *object_new(const char *typename);
>
> +/**
> + * object_new_child:
> + * @parent: the QOM composition-tree parent
> + * @id: the child<> property name; the object's canonical QOM path
> + * becomes @parent's path plus "/" plus @id
> + * @typename: the name of the type of the object to instantiate
> + *
> + * Create a heap-allocated object and immediately add it to the QOM
> + * composition tree as a child of @parent.
> + *
> + * This is the heap-allocated dual of object_initialize_child(): use
> + * this when the child is a pointer member of the parent, and use
> + * object_initialize_child() when the child is embedded in the parent
> + * struct. See also object_new_with_props() for the variant that
> + * additionally sets a list of properties.
> + *
> + * The reference returned by object_new() is transferred to the child<>
> + * property of @parent, so the object has a reference count of 1 held
> + * by @parent, and the caller does not need to unref.
> + *
> + * Returns: the newly allocated, instantiated and parented object.
> + */
> +Object *object_new_child(Object *parent, const char *id,
> + const char *typename);
> +
> /**
> * object_new_with_props:
> * @typename: The name of the type of the object to instantiate.
> diff --git a/qom/object.c b/qom/object.c
> index f79b2cf361..b4d181b617 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -718,6 +718,19 @@ Object *object_new(const char *typename)
> return object_new_with_type(ti);
> }
>
> +Object *object_new_child(Object *parent, const char *id,
> + const char *typename)
> +{
> + Object *obj;
> +
> + g_assert(parent);
> + g_assert(id);
> +
> + obj = object_new(typename);
> + object_property_add_child(parent, id, obj);
> + object_unref(obj);
> + return obj;
> +}
>
> Object *object_new_with_props(const char *typename,
> Object *parent,
> --
> 2.47.1
>
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 156+ messages in thread* Re: [RFC PATCH 001/134] qom: Introduce object_new_child()
2026-07-13 8:47 ` Daniel P. Berrangé
@ 2026-07-13 9:01 ` Graf (AWS), Alexander
0 siblings, 0 replies; 156+ messages in thread
From: Graf (AWS), Alexander @ 2026-07-13 9:01 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: qemu-devel@nongnu.org, qemu-arm@nongnu.org, qemu-ppc@nongnu.org,
qemu-riscv@nongnu.org, qemu-s390x@nongnu.org, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Alex Bennée
On 13.07.26 10:47, Daniel P. Berrangé wrote:
> On Sat, Jul 11, 2026 at 10:34:54PM +0000, Alexander Graf wrote:
>> We already have two ways of creating a QOM object with a parent set
>> from birth: object_initialize_child() for objects embedded in the
>> parent struct, and object_new_with_props() for heap-allocated objects
>> that also want a list of string properties applied. What we do not
>> have is the plain heap-allocated dual of object_initialize_child():
>> create the object, add it as a child<> of a given parent under a given
>> name, and hand the reference to the parent.
>>
>> Board and composite-device code that heap-allocates children today
>> therefore either open-codes object_new()+object_property_add_child()
>> +object_unref(), or skips the parenting step entirely and lets
>> device_set_realized() dump the object into /machine/unattached.
>>
>> Add object_new_child(parent, id, typename) as that missing primitive.
>> The reference created by object_new() is transferred to the parent's
>> child<> property, so on return the sole reference is held by @parent
>> and the caller does not need to unref. Later patches build the qdev
>> and per-bus creation helpers on top of this.
>>
>> Suggested-by: Markus Armbruster <armbru@redhat.com>
>> Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
>> Assisted-by: Kiro
> QEMU does not currently permit contributions assisted by AI
> coding tools.
>
> There is an open discussion about altering the policy but that
> is not conclude with agreement yet.
Yup, which is why I called out exactly that in the cover letter too. Is
is also the main reason that this patch set is RFC :).
This set is a follow-up from a request by Markus to fix up the QOM
parent hierarchy. I said that I (and probably nobody else in CC) had the
dedicated time to perform that conversion by hand. And if we
"distribute" the work, then IMHO it will just never get done.
But I could easily leave an AI running on the side to get it done. This
is so that we can see whether we want to 1/ change our AI stance or 2/
get inspired by the AI code and have someone else redo it by hand or 3/
leave it be and continue living with the QOM tech debt.
Alex
^ permalink raw reply [flat|nested] 156+ messages in thread
* Re: [RFC PATCH 001/134] qom: Introduce object_new_child()
2026-07-11 22:34 ` [RFC PATCH 001/134] qom: Introduce object_new_child() Alexander Graf
2026-07-13 8:47 ` Daniel P. Berrangé
@ 2026-07-13 16:49 ` Richard Henderson
2026-07-13 18:15 ` Peter Maydell
1 sibling, 1 reply; 156+ messages in thread
From: Richard Henderson @ 2026-07-13 16:49 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
On 7/11/26 15:34, Alexander Graf wrote:
> We already have two ways of creating a QOM object with a parent set
> from birth: object_initialize_child() for objects embedded in the
> parent struct, and object_new_with_props() for heap-allocated objects
> that also want a list of string properties applied. What we do not
> have is the plain heap-allocated dual of object_initialize_child():
> create the object, add it as a child<> of a given parent under a given
> name, and hand the reference to the parent.
>
> Board and composite-device code that heap-allocates children today
> therefore either open-codes object_new()+object_property_add_child()
> +object_unref(), or skips the parenting step entirely and lets
> device_set_realized() dump the object into /machine/unattached.
>
> Add object_new_child(parent, id, typename) as that missing primitive.
> The reference created by object_new() is transferred to the parent's
> child<> property, so on return the sole reference is held by @parent
> and the caller does not need to unref. Later patches build the qdev
> and per-bus creation helpers on top of this.
>
> Suggested-by: Markus Armbruster <armbru@redhat.com>
> Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> include/qom/object.h | 25 +++++++++++++++++++++++++
> qom/object.c | 13 +++++++++++++
> 2 files changed, 38 insertions(+)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> +Object *object_new_child(Object *parent, const char *id,
> + const char *typename)
> +{
> + Object *obj;
> +
> + g_assert(parent);
> + g_assert(id);
Of course, typename can't be null either.
But it reminds me that gcc and llvm have attributes nonnull and returns_nonnull; we should
be using those, both for their Werror and documentation values.
r~
^ permalink raw reply [flat|nested] 156+ messages in thread* Re: [RFC PATCH 001/134] qom: Introduce object_new_child()
2026-07-13 16:49 ` Richard Henderson
@ 2026-07-13 18:15 ` Peter Maydell
2026-07-13 18:47 ` Daniel P. Berrangé
0 siblings, 1 reply; 156+ messages in thread
From: Peter Maydell @ 2026-07-13 18:15 UTC (permalink / raw)
To: Richard Henderson; +Cc: Alexander Graf, qemu-devel
On Mon, 13 Jul 2026 at 17:50, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> On 7/11/26 15:34, Alexander Graf wrote:
> > We already have two ways of creating a QOM object with a parent set
> > from birth: object_initialize_child() for objects embedded in the
> > parent struct, and object_new_with_props() for heap-allocated objects
> > that also want a list of string properties applied. What we do not
> > have is the plain heap-allocated dual of object_initialize_child():
> > create the object, add it as a child<> of a given parent under a given
> > name, and hand the reference to the parent.
> >
> > Board and composite-device code that heap-allocates children today
> > therefore either open-codes object_new()+object_property_add_child()
> > +object_unref(), or skips the parenting step entirely and lets
> > device_set_realized() dump the object into /machine/unattached.
> >
> > Add object_new_child(parent, id, typename) as that missing primitive.
> > The reference created by object_new() is transferred to the parent's
> > child<> property, so on return the sole reference is held by @parent
> > and the caller does not need to unref. Later patches build the qdev
> > and per-bus creation helpers on top of this.
> >
> > Suggested-by: Markus Armbruster <armbru@redhat.com>
> > Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
> > Assisted-by: Kiro
> > Signed-off-by: Alexander Graf <graf@amazon.com>
> > ---
> > include/qom/object.h | 25 +++++++++++++++++++++++++
> > qom/object.c | 13 +++++++++++++
> > 2 files changed, 38 insertions(+)
>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
>
> > +Object *object_new_child(Object *parent, const char *id,
> > + const char *typename)
> > +{
> > + Object *obj;
> > +
> > + g_assert(parent);
> > + g_assert(id);
>
> Of course, typename can't be null either.
These asserts are of the "not very useful" kind, as well --
if either of these are NULL we're going to crash pretty quickly,
and then the debugger backtrace will point you at your programming
error. Asserts are most useful when they turn non-obvious bugs
into obvious bugs or turn "happens a long time later than when the
problem is" bugs into "happens very close to when the problem is".
bugs.
-- PMM
^ permalink raw reply [flat|nested] 156+ messages in thread* Re: [RFC PATCH 001/134] qom: Introduce object_new_child()
2026-07-13 18:15 ` Peter Maydell
@ 2026-07-13 18:47 ` Daniel P. Berrangé
2026-07-13 19:07 ` Peter Maydell
0 siblings, 1 reply; 156+ messages in thread
From: Daniel P. Berrangé @ 2026-07-13 18:47 UTC (permalink / raw)
To: Peter Maydell; +Cc: Richard Henderson, Alexander Graf, qemu-devel
On Mon, Jul 13, 2026 at 07:15:34PM +0100, Peter Maydell wrote:
> On Mon, 13 Jul 2026 at 17:50, Richard Henderson
> <richard.henderson@linaro.org> wrote:
> >
> > On 7/11/26 15:34, Alexander Graf wrote:
> > > We already have two ways of creating a QOM object with a parent set
> > > from birth: object_initialize_child() for objects embedded in the
> > > parent struct, and object_new_with_props() for heap-allocated objects
> > > that also want a list of string properties applied. What we do not
> > > have is the plain heap-allocated dual of object_initialize_child():
> > > create the object, add it as a child<> of a given parent under a given
> > > name, and hand the reference to the parent.
> > >
> > > Board and composite-device code that heap-allocates children today
> > > therefore either open-codes object_new()+object_property_add_child()
> > > +object_unref(), or skips the parenting step entirely and lets
> > > device_set_realized() dump the object into /machine/unattached.
> > >
> > > Add object_new_child(parent, id, typename) as that missing primitive.
> > > The reference created by object_new() is transferred to the parent's
> > > child<> property, so on return the sole reference is held by @parent
> > > and the caller does not need to unref. Later patches build the qdev
> > > and per-bus creation helpers on top of this.
> > >
> > > Suggested-by: Markus Armbruster <armbru@redhat.com>
> > > Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
> > > Assisted-by: Kiro
> > > Signed-off-by: Alexander Graf <graf@amazon.com>
> > > ---
> > > include/qom/object.h | 25 +++++++++++++++++++++++++
> > > qom/object.c | 13 +++++++++++++
> > > 2 files changed, 38 insertions(+)
> >
> > Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> >
> > > +Object *object_new_child(Object *parent, const char *id,
> > > + const char *typename)
> > > +{
> > > + Object *obj;
> > > +
> > > + g_assert(parent);
> > > + g_assert(id);
> >
> > Of course, typename can't be null either.
>
> These asserts are of the "not very useful" kind, as well --
> if either of these are NULL we're going to crash pretty quickly,
> and then the debugger backtrace will point you at your programming
> error. Asserts are most useful when they turn non-obvious bugs
> into obvious bugs or turn "happens a long time later than when the
> problem is" bugs into "happens very close to when the problem is".
> bugs.
For the 'id', we ought to call id_wellformed, and report an error
if it fails, which implies an "Error **errp" arg for this method
too.
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 156+ messages in thread* Re: [RFC PATCH 001/134] qom: Introduce object_new_child()
2026-07-13 18:47 ` Daniel P. Berrangé
@ 2026-07-13 19:07 ` Peter Maydell
0 siblings, 0 replies; 156+ messages in thread
From: Peter Maydell @ 2026-07-13 19:07 UTC (permalink / raw)
To: Daniel P. Berrangé; +Cc: Richard Henderson, Alexander Graf, qemu-devel
On Mon, 13 Jul 2026 at 19:47, Daniel P. Berrangé <berrange@redhat.com> wrote:
>
> On Mon, Jul 13, 2026 at 07:15:34PM +0100, Peter Maydell wrote:
> > On Mon, 13 Jul 2026 at 17:50, Richard Henderson
> > <richard.henderson@linaro.org> wrote:
> > >
> > > On 7/11/26 15:34, Alexander Graf wrote:
> > > > +Object *object_new_child(Object *parent, const char *id,
> > > > + const char *typename)
> > > > +{
> > > > + Object *obj;
> > > > +
> > > > + g_assert(parent);
> > > > + g_assert(id);
> > >
> > > Of course, typename can't be null either.
> >
> > These asserts are of the "not very useful" kind, as well --
> > if either of these are NULL we're going to crash pretty quickly,
> > and then the debugger backtrace will point you at your programming
> > error. Asserts are most useful when they turn non-obvious bugs
> > into obvious bugs or turn "happens a long time later than when the
> > problem is" bugs into "happens very close to when the problem is".
> > bugs.
>
> For the 'id', we ought to call id_wellformed, and report an error
> if it fails, which implies an "Error **errp" arg for this method
> too.
That would be a programming error, which we should assert() on
if we want to check it. Adding an Error* argument just for that
would be forcing all the (many many) callsites to add extra
error handling code for a can't-happen case. QOM error-handling
boilerplate is bad enough already.
-- PMM
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 002/134] qdev: Rename qdev_new()/qdev_try_new() to *_orphan()
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
2026-07-11 22:34 ` [RFC PATCH 001/134] qom: Introduce object_new_child() Alexander Graf
@ 2026-07-11 22:34 ` Alexander Graf
2026-07-13 8:22 ` Philippe Mathieu-Daudé
2026-07-11 22:34 ` [RFC PATCH 003/134] qdev: Reintroduce qdev_new() with a mandatory QOM parent Alexander Graf
` (132 subsequent siblings)
134 siblings, 1 reply; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:34 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
qdev_new() creates a device on the heap without a QOM parent. If the
caller does not add one before realize, device_set_realized() dumps
the device into /machine/unattached with an unstable canonical path.
We want the short spelling qdev_new() to be the one that gets
parenting right by construction. As a first step, rename the current
functions to qdev_new_orphan() and qdev_try_new_orphan() tree-wide so
that a subsequent commit can reintroduce qdev_new() with a mandatory
(parent, id, type) signature.
Purely mechanical, generated by
spatch --sp-file scripts/coccinelle/qom-parent/qdev-new-orphan.cocci \
--in-place --include-headers --dir .
or equivalently
git ls-files '*.[ch]' '*.[ch].inc' '*.rst' '*.py' | \
grep -v '^subprojects/' | \
xargs sed -i 's/\bqdev_try_new\b/qdev_try_new_orphan/g;
s/\bqdev_new\b/qdev_new_orphan/g'
No functional change.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/alpha/typhoon.c | 2 +-
hw/arm/aspeed.c | 2 +-
hw/arm/aspeed_soc_common.c | 4 +-
hw/arm/bananapi_m2u.c | 2 +-
hw/arm/cubieboard.c | 2 +-
hw/arm/exynos4210.c | 12 ++--
hw/arm/imx25_pdk.c | 2 +-
hw/arm/imx8mm-evk.c | 2 +-
hw/arm/imx8mp-evk.c | 2 +-
hw/arm/integratorcp.c | 8 +--
hw/arm/max78000fthr.c | 2 +-
hw/arm/mcimx6ul-evk.c | 2 +-
hw/arm/mcimx7d-sabre.c | 2 +-
hw/arm/mps2-tz.c | 4 +-
hw/arm/mps2.c | 4 +-
hw/arm/msf2-som.c | 4 +-
hw/arm/musicpal.c | 6 +-
hw/arm/netduino2.c | 2 +-
hw/arm/netduinoplus2.c | 2 +-
hw/arm/npcm7xx_boards.c | 4 +-
hw/arm/npcm8xx_boards.c | 2 +-
hw/arm/olimex-stm32-h405.c | 2 +-
hw/arm/omap1.c | 12 ++--
hw/arm/orangepi.c | 2 +-
hw/arm/raspi.c | 2 +-
hw/arm/realview.c | 18 ++---
hw/arm/sabrelite.c | 2 +-
hw/arm/sbsa-ref.c | 20 +++---
hw/arm/stellaris.c | 20 +++---
hw/arm/stm32vldiscovery.c | 2 +-
hw/arm/strongarm.c | 4 +-
hw/arm/versatilepb.c | 14 ++--
hw/arm/vexpress.c | 14 ++--
hw/arm/virt.c | 24 +++----
hw/arm/xilinx_zynq.c | 26 +++----
hw/arm/xlnx-versal-virt.c | 2 +-
hw/arm/xlnx-versal.c | 70 +++++++++----------
hw/arm/xlnx-zcu102.c | 6 +-
hw/arm/xlnx-zynqmp.c | 2 +-
hw/audio/intel-hda.c | 2 +-
hw/audio/model.c | 2 +-
hw/avr/atmega.c | 2 +-
hw/block/fdc-sysbus.c | 4 +-
hw/block/fdc.c | 2 +-
hw/block/pflash_cfi01.c | 2 +-
hw/block/pflash_cfi02.c | 2 +-
hw/block/xen-block.c | 2 +-
hw/char/exynos4210_uart.c | 2 +-
hw/char/mcf_uart.c | 2 +-
hw/char/mchp_pfsoc_mmuart.c | 2 +-
hw/char/pl011.c | 2 +-
hw/char/serial-mm.c | 2 +-
hw/char/sifive_uart.c | 2 +-
hw/char/spapr_vty.c | 2 +-
hw/char/xen_console.c | 2 +-
hw/core/qdev.c | 4 +-
hw/core/sysbus.c | 2 +-
hw/cxl/cxl-host.c | 2 +-
hw/display/sm501.c | 2 +-
hw/display/xlnx_dp.c | 4 +-
hw/dma/rc4030.c | 2 +-
hw/hexagon/hexagon_dsp.c | 4 +-
hw/hexagon/virt.c | 6 +-
hw/hppa/machine.c | 12 ++--
hw/i2c/core.c | 2 +-
hw/i2c/smbus_eeprom.c | 2 +-
hw/i386/microvm.c | 6 +-
hw/i386/nitro_enclave.c | 4 +-
hw/i386/pc.c | 2 +-
hw/i386/pc_piix.c | 2 +-
hw/i386/pc_q35.c | 2 +-
hw/i386/pc_sysfw.c | 2 +-
hw/i386/sgx.c | 2 +-
hw/i386/x86-common.c | 6 +-
hw/i3c/core.c | 2 +-
hw/ide/ide-bus.c | 2 +-
hw/intc/exynos4210_gic.c | 2 +-
hw/intc/riscv_aclint.c | 4 +-
hw/intc/riscv_aplic.c | 2 +-
hw/intc/riscv_imsic.c | 2 +-
hw/intc/s390_flic.c | 4 +-
hw/intc/sifive_plic.c | 2 +-
hw/isa/isa-bus.c | 6 +-
hw/loongarch/virt.c | 18 ++---
hw/m68k/an5206.c | 2 +-
hw/m68k/mcf_intc.c | 2 +-
hw/m68k/next-cube.c | 2 +-
hw/m68k/q800.c | 4 +-
hw/m68k/virt.c | 10 +--
hw/mem/sparse-mem.c | 2 +-
hw/microblaze/petalogix_ml605_mmu.c | 12 ++--
hw/microblaze/petalogix_s3adsp1800_mmu.c | 8 +--
hw/mips/boston.c | 4 +-
hw/mips/jazz.c | 12 ++--
hw/mips/loongson3_virt.c | 6 +-
hw/mips/malta.c | 4 +-
hw/misc/empty_slot.c | 2 +-
hw/misc/led.c | 2 +-
hw/misc/sifive_e_prci.c | 2 +-
hw/misc/sifive_test.c | 2 +-
hw/net/lan9118.c | 2 +-
hw/net/smc91c111.c | 2 +-
hw/net/spapr_llan.c | 2 +-
hw/net/xen_nic.c | 2 +-
hw/nitro/machine.c | 4 +-
hw/nitro/nitro-vsock-bus.c | 2 +-
hw/nvme/ctrl.c | 2 +-
hw/nvram/fw_cfg.c | 4 +-
hw/or1k/or1k-sim.c | 6 +-
hw/or1k/virt.c | 8 +--
hw/pci-bridge/pci_expander_bridge.c | 4 +-
hw/pci-host/astro.c | 2 +-
hw/pci-host/bonito.c | 2 +-
hw/pci-host/pnv_phb4_pec.c | 2 +-
hw/pci/pci.c | 2 +-
hw/ppc/amigaone.c | 2 +-
hw/ppc/e500.c | 22 +++---
hw/ppc/mac_newworld.c | 18 ++---
hw/ppc/mac_oldworld.c | 8 +--
hw/ppc/pnv.c | 4 +-
hw/ppc/pnv_bmc.c | 2 +-
hw/ppc/ppc440_bamboo.c | 4 +-
hw/ppc/prep.c | 4 +-
hw/ppc/sam460ex.c | 16 ++---
hw/ppc/spapr.c | 4 +-
hw/ppc/spapr_irq.c | 2 +-
hw/ppc/spapr_vio.c | 2 +-
hw/ppc/virtex_ml507.c | 6 +-
hw/remote/machine.c | 2 +-
hw/riscv/boston-aia.c | 4 +-
hw/riscv/microblaze-v-generic.c | 14 ++--
hw/riscv/microchip_pfsoc.c | 2 +-
hw/riscv/sifive_u.c | 4 +-
hw/riscv/virt.c | 8 +--
hw/rtc/sun4v-rtc.c | 2 +-
hw/s390x/ap-bridge.c | 2 +-
hw/s390x/css-bridge.c | 2 +-
hw/s390x/s390-pci-bus.c | 2 +-
hw/s390x/s390-virtio-ccw.c | 6 +-
hw/scsi/lasi_ncr710.c | 2 +-
hw/scsi/ncr53c710.c | 4 +-
hw/scsi/scsi-bus.c | 2 +-
hw/scsi/spapr_vscsi.c | 2 +-
hw/sh4/r2d.c | 6 +-
hw/sh4/sh7750.c | 4 +-
hw/sparc/leon3.c | 10 +--
hw/sparc/sun4m.c | 38 +++++-----
hw/sparc64/sun4u.c | 14 ++--
hw/ssi/ssi.c | 2 +-
hw/tricore/tricore_testboard.c | 2 +-
hw/ufs/lu.c | 2 +-
hw/usb/bus.c | 4 +-
hw/usb/dev-serial.c | 2 +-
hw/vmapple/vmapple.c | 20 +++---
hw/xen/xen-bus.c | 2 +-
hw/xen/xen-legacy-backend.c | 2 +-
hw/xen/xen-pvh-common.c | 2 +-
hw/xtensa/virt.c | 2 +-
hw/xtensa/xtfpga.c | 2 +-
include/hw/core/qdev.h | 14 ++--
include/hw/i2c/i2c.h | 2 +-
include/hw/misc/unimp.h | 2 +-
include/hw/ssi/ssi.h | 2 +-
include/hw/usb/usb.h | 2 +-
migration/migration.c | 2 +-
net/net.c | 4 +-
.../qom-parent/qdev-new-orphan.cocci | 18 +++++
system/qdev-monitor.c | 2 +-
target/mips/cpu.c | 2 +-
target/xtensa/cpu.c | 2 +-
170 files changed, 459 insertions(+), 441 deletions(-)
create mode 100644 scripts/coccinelle/qom-parent/qdev-new-orphan.cocci
diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
index e32fed86f9..af40647ccd 100644
--- a/hw/alpha/typhoon.c
+++ b/hw/alpha/typhoon.c
@@ -830,7 +830,7 @@ PCIBus *typhoon_init(MemoryRegion *ram, qemu_irq *p_isa_irq,
PCIBus *b;
int i;
- dev = qdev_new(TYPE_TYPHOON_PCI_HOST_BRIDGE);
+ dev = qdev_new_orphan(TYPE_TYPHOON_PCI_HOST_BRIDGE);
s = TYPHOON_PCI_HOST_BRIDGE(dev);
phb = PCI_HOST_BRIDGE(dev);
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index a48c442058..531e3ce276 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -90,7 +90,7 @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
if (!dinfo) {
return;
}
- card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD);
+ card = qdev_new_orphan(emmc ? TYPE_EMMC : TYPE_SD_CARD);
/*
* Force the boot properties of the eMMC device only when the
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
index fd08793575..33f7f10531 100644
--- a/hw/arm/aspeed_soc_common.c
+++ b/hw/arm/aspeed_soc_common.c
@@ -81,7 +81,7 @@ bool aspeed_soc_dram_init(AspeedSoCState *s, Error **errp)
* SoC has.
*/
if (ram_size < max_ram_size) {
- DeviceState *dev = qdev_new(TYPE_UNIMPLEMENTED_DEVICE);
+ DeviceState *dev = qdev_new_orphan(TYPE_UNIMPLEMENTED_DEVICE);
qdev_prop_set_string(dev, "name", "ram-empty");
qdev_prop_set_uint64(dev, "size", max_ram_size - ram_size);
@@ -128,7 +128,7 @@ void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
DeviceState *dev;
- dev = qdev_new(flashtype);
+ dev = qdev_new_orphan(flashtype);
if (dinfo) {
qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
}
diff --git a/hw/arm/bananapi_m2u.c b/hw/arm/bananapi_m2u.c
index 9b468cd8ac..748db26d41 100644
--- a/hw/arm/bananapi_m2u.c
+++ b/hw/arm/bananapi_m2u.c
@@ -50,7 +50,7 @@ static void mmc_attach_drive(AwR40State *s, AwSdHostState *mmc, int unit,
exit(1);
}
- carddev = qdev_new(TYPE_SD_CARD);
+ carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev, bus, &error_fatal);
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index a643ae4e27..215741a194 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -89,7 +89,7 @@ static void cubieboard_init(MachineState *machine)
bus = qdev_get_child_bus(DEVICE(a10), "sd-bus");
/* Plug in SD card */
- carddev = qdev_new(TYPE_SD_CARD);
+ carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev, bus, &error_fatal);
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
index 5efe95030c..2b6e61abd0 100644
--- a/hw/arm/exynos4210.c
+++ b/hw/arm/exynos4210.c
@@ -519,7 +519,7 @@ static DeviceState *pl330_create(uint32_t base, OrIRQState *orgate,
DeviceState *dev;
int i;
- dev = qdev_new("pl330");
+ dev = qdev_new_orphan("pl330");
object_property_set_link(OBJECT(dev), "memory",
OBJECT(get_system_memory()),
&error_fatal);
@@ -687,7 +687,7 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
NULL);
/* Multi Core Timer */
- dev = qdev_new("exynos4210.mct");
+ dev = qdev_new_orphan("exynos4210.mct");
busdev = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(busdev, &error_fatal);
for (n = 0; n < 4; n++) {
@@ -713,7 +713,7 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
i2c_irq = s->irq_table[exynos4210_get_irq(EXYNOS4210_HDMI_INTG, 1)];
}
- dev = qdev_new("exynos4210.i2c");
+ dev = qdev_new_orphan("exynos4210.i2c");
busdev = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(busdev, &error_fatal);
sysbus_connect_irq(busdev, 0, i2c_irq);
@@ -757,7 +757,7 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
* public datasheet which is very similar (implementing
* MMC Specification Version 4.0 being the only difference noted)
*/
- dev = qdev_new(TYPE_S3C_SDHCI);
+ dev = qdev_new_orphan(TYPE_S3C_SDHCI);
qdev_prop_set_uint64(dev, "capareg", EXYNOS4210_SDHCI_CAPABILITIES);
busdev = SYS_BUS_DEVICE(dev);
@@ -767,14 +767,14 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
di = drive_get(IF_SD, 0, n);
blk = di ? blk_by_legacy_dinfo(di) : NULL;
- carddev = qdev_new(TYPE_SD_CARD);
+ carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive(carddev, "drive", blk);
qdev_realize_and_unref(carddev, qdev_get_child_bus(dev, "sd-bus"),
&error_fatal);
}
/*** Display controller (FIMD) ***/
- dev = qdev_new("exynos4210.fimd");
+ dev = qdev_new_orphan("exynos4210.fimd");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
OBJECT(system_mem), &error_fatal);
busdev = SYS_BUS_DEVICE(dev);
diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c
index 7ebd6c8eb9..6976652370 100644
--- a/hw/arm/imx25_pdk.c
+++ b/hw/arm/imx25_pdk.c
@@ -127,7 +127,7 @@ static void imx25_pdk_init(MachineState *machine)
di = drive_get(IF_SD, 0, i);
blk = di ? blk_by_legacy_dinfo(di) : NULL;
bus = qdev_get_child_bus(DEVICE(&s->soc.esdhc[i]), "sd-bus");
- carddev = qdev_new(TYPE_SD_CARD);
+ carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev, bus, &error_fatal);
}
diff --git a/hw/arm/imx8mm-evk.c b/hw/arm/imx8mm-evk.c
index 6b7774d3e2..ce7693ca7a 100644
--- a/hw/arm/imx8mm-evk.c
+++ b/hw/arm/imx8mm-evk.c
@@ -97,7 +97,7 @@ static void imx8mm_evk_init(MachineState *machine)
blk = blk_by_legacy_dinfo(di);
bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
- carddev = qdev_new(TYPE_SD_CARD);
+ carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev, bus, &error_fatal);
}
diff --git a/hw/arm/imx8mp-evk.c b/hw/arm/imx8mp-evk.c
index 16e9722d14..90cda63b49 100644
--- a/hw/arm/imx8mp-evk.c
+++ b/hw/arm/imx8mp-evk.c
@@ -110,7 +110,7 @@ static void imx8mp_evk_init(MachineState *machine)
blk = blk_by_legacy_dinfo(di);
bus = qdev_get_child_bus(DEVICE(&s->soc.usdhc[i]), "sd-bus");
- carddev = qdev_new(TYPE_SD_CARD);
+ carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev, bus, &error_fatal);
}
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index c25bbf3c82..8a56165cc2 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -621,7 +621,7 @@ static void integratorcp_init(MachineState *machine)
0, ram_size);
memory_region_add_subregion(address_space_mem, 0x80000000, ram_alias);
- dev = qdev_new(TYPE_INTEGRATOR_CM);
+ dev = qdev_new_orphan(TYPE_INTEGRATOR_CM);
qdev_prop_set_uint32(dev, "memsz", ram_size >> 20);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map((SysBusDevice *)dev, 0, 0x10000000);
@@ -654,14 +654,14 @@ static void integratorcp_init(MachineState *machine)
if (dinfo) {
DeviceState *card;
- card = qdev_new(TYPE_SD_CARD);
+ card = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
qdev_realize_and_unref(card, qdev_get_child_bus(dev, "sd-bus"),
&error_fatal);
}
- dev = qdev_new("pl041");
+ dev = qdev_new_orphan("pl041");
if (machine->audiodev) {
qdev_prop_set_string(dev, "audiodev", machine->audiodev);
}
@@ -673,7 +673,7 @@ static void integratorcp_init(MachineState *machine)
smc91c111_init(0xc8000000, pic[27]);
}
- dev = qdev_new("pl110");
+ dev = qdev_new_orphan("pl110");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
OBJECT(address_space_mem), &error_fatal);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/arm/max78000fthr.c b/hw/arm/max78000fthr.c
index 530ca9dd96..d2fb4c018b 100644
--- a/hw/arm/max78000fthr.c
+++ b/hw/arm/max78000fthr.c
@@ -26,7 +26,7 @@ static void max78000_init(MachineState *machine)
sysclk = clock_new(OBJECT(machine), "SYSCLK");
clock_set_hz(sysclk, SYSCLK_FRQ);
- dev = qdev_new(TYPE_MAX78000_SOC);
+ dev = qdev_new_orphan(TYPE_MAX78000_SOC);
object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
qdev_connect_clock_in(dev, "sysclk", sysclk);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/arm/mcimx6ul-evk.c b/hw/arm/mcimx6ul-evk.c
index 6e9d92b1f1..96309e1bfc 100644
--- a/hw/arm/mcimx6ul-evk.c
+++ b/hw/arm/mcimx6ul-evk.c
@@ -59,7 +59,7 @@ static void mcimx6ul_evk_init(MachineState *machine)
di = drive_get(IF_SD, 0, i);
blk = di ? blk_by_legacy_dinfo(di) : NULL;
bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
- carddev = qdev_new(TYPE_SD_CARD);
+ carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev, bus, &error_fatal);
}
diff --git a/hw/arm/mcimx7d-sabre.c b/hw/arm/mcimx7d-sabre.c
index a0ac647c3d..be9d0d6993 100644
--- a/hw/arm/mcimx7d-sabre.c
+++ b/hw/arm/mcimx7d-sabre.c
@@ -59,7 +59,7 @@ static void mcimx7d_sabre_init(MachineState *machine)
di = drive_get(IF_SD, 0, i);
blk = di ? blk_by_legacy_dinfo(di) : NULL;
bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
- carddev = qdev_new(TYPE_SD_CARD);
+ carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev, bus, &error_fatal);
}
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
index f101c1b7c3..c0ab898f2e 100644
--- a/hw/arm/mps2-tz.c
+++ b/hw/arm/mps2-tz.c
@@ -508,7 +508,7 @@ static MemoryRegion *make_eth_dev(MPS2TZMachineState *mms, void *opaque,
/* In hardware this is a LAN9220; the LAN9118 is software compatible
* except that it doesn't support the checksum-offload feature.
*/
- mms->lan9118 = qdev_new(TYPE_LAN9118);
+ mms->lan9118 = qdev_new_orphan(TYPE_LAN9118);
qemu_configure_nic_device(mms->lan9118, true, NULL);
s = SYS_BUS_DEVICE(mms->lan9118);
@@ -535,7 +535,7 @@ static MemoryRegion *make_eth_usb(MPS2TZMachineState *mms, void *opaque,
* In hardware this is a LAN9220; the LAN9118 is software compatible
* except that it doesn't support the checksum-offload feature.
*/
- mms->lan9118 = qdev_new(TYPE_LAN9118);
+ mms->lan9118 = qdev_new_orphan(TYPE_LAN9118);
qemu_configure_nic_device(mms->lan9118, true, NULL);
s = SYS_BUS_DEVICE(mms->lan9118);
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
index ac9366d844..96af49e213 100644
--- a/hw/arm/mps2.c
+++ b/hw/arm/mps2.c
@@ -299,7 +299,7 @@ static void mps2_common_init(MachineState *machine)
rxovrint = qdev_get_gpio_in(orgate_dev, i * 2 + 1);
}
- dev = qdev_new(TYPE_CMSDK_APB_UART);
+ dev = qdev_new_orphan(TYPE_CMSDK_APB_UART);
s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(i));
qdev_prop_set_uint32(dev, "pclk-frq", SYSCLK_FRQ);
@@ -343,7 +343,7 @@ static void mps2_common_init(MachineState *machine)
qdev_connect_gpio_out(txrx_orgate_dev, 0,
qdev_get_gpio_in(armv7m, uart_txrx_irqno[i]));
- dev = qdev_new(TYPE_CMSDK_APB_UART);
+ dev = qdev_new_orphan(TYPE_CMSDK_APB_UART);
s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(i));
qdev_prop_set_uint32(dev, "pclk-frq", SYSCLK_FRQ);
diff --git a/hw/arm/msf2-som.c b/hw/arm/msf2-som.c
index 1ada1a1361..bb1e774764 100644
--- a/hw/arm/msf2-som.c
+++ b/hw/arm/msf2-som.c
@@ -59,7 +59,7 @@ static void emcraft_sf2_s2s010_init(MachineState *machine)
&error_fatal);
memory_region_add_subregion(sysmem, DDR_BASE_ADDRESS, ddr);
- dev = qdev_new(TYPE_MSF2_SOC);
+ dev = qdev_new_orphan(TYPE_MSF2_SOC);
object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
qdev_prop_set_string(dev, "part-name", "M2S010");
qdev_prop_set_uint64(dev, "eNVM-size", M2S010_ENVM_SIZE);
@@ -83,7 +83,7 @@ static void emcraft_sf2_s2s010_init(MachineState *machine)
/* Attach SPI flash to SPI0 controller */
spi_bus = qdev_get_child_bus(dev, "spi0");
- spi_flash = qdev_new("s25sl12801"); /* Spansion S25FL128SDPBHICO */
+ spi_flash = qdev_new_orphan("s25sl12801"); /* Spansion S25FL128SDPBHICO */
qdev_prop_set_uint8(spi_flash, "spansion-cr2nv", 0x8);
if (dinfo) {
qdev_prop_set_drive_err(spi_flash, "drive",
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index 69e83bdd97..6dd18a67b2 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1249,7 +1249,7 @@ static void musicpal_init(MachineState *machine)
qdev_get_gpio_in(pic, MP_TIMER4_IRQ), NULL);
/* Logically OR both UART IRQs together */
- uart_orgate = qdev_new(TYPE_OR_IRQ);
+ uart_orgate = qdev_new_orphan(TYPE_OR_IRQ);
object_property_set_int(OBJECT(uart_orgate), "num-lines", 2, &error_fatal);
qdev_realize_and_unref(uart_orgate, NULL, &error_fatal);
qdev_connect_gpio_out(uart_orgate, 0,
@@ -1288,7 +1288,7 @@ static void musicpal_init(MachineState *machine)
}
sysbus_create_simple(TYPE_MV88W8618_FLASHCFG, MP_FLASHCFG_BASE, NULL);
- dev = qdev_new(TYPE_MV88W8618_ETH);
+ dev = qdev_new_orphan(TYPE_MV88W8618_ETH);
qemu_configure_nic_device(dev, true, "mv88w8618");
object_property_set_link(OBJECT(dev), "dma-memory",
OBJECT(get_system_memory()), &error_fatal);
@@ -1333,7 +1333,7 @@ static void musicpal_init(MachineState *machine)
}
i2c_slave_realize_and_unref(wm8750_dev, i2c, &error_abort);
- dev = qdev_new(TYPE_MV88W8618_AUDIO);
+ dev = qdev_new_orphan(TYPE_MV88W8618_AUDIO);
s = SYS_BUS_DEVICE(dev);
object_property_set_link(OBJECT(dev), "wm8750", OBJECT(wm8750_dev),
NULL);
diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c
index c32deaf43b..cee887c194 100644
--- a/hw/arm/netduino2.c
+++ b/hw/arm/netduino2.c
@@ -44,7 +44,7 @@ static void netduino2_init(MachineState *machine)
sysclk = clock_new(OBJECT(machine), "SYSCLK");
clock_set_hz(sysclk, SYSCLK_FRQ);
- dev = qdev_new(TYPE_STM32F205_SOC);
+ dev = qdev_new_orphan(TYPE_STM32F205_SOC);
object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
qdev_connect_clock_in(dev, "sysclk", sysclk);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/arm/netduinoplus2.c b/hw/arm/netduinoplus2.c
index a90dcbe8c2..65251dfe96 100644
--- a/hw/arm/netduinoplus2.c
+++ b/hw/arm/netduinoplus2.c
@@ -44,7 +44,7 @@ static void netduinoplus2_init(MachineState *machine)
sysclk = clock_new(OBJECT(machine), "SYSCLK");
clock_set_hz(sysclk, SYSCLK_FRQ);
- dev = qdev_new(TYPE_STM32F405_SOC);
+ dev = qdev_new_orphan(TYPE_STM32F405_SOC);
object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
qdev_connect_clock_in(dev, "sysclk", sysclk);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
index 57a8d3186e..9e5d5f08f9 100644
--- a/hw/arm/npcm7xx_boards.c
+++ b/hw/arm/npcm7xx_boards.c
@@ -84,7 +84,7 @@ static void npcm7xx_connect_flash(NPCM7xxFIUState *fiu, int cs_no,
DeviceState *flash;
qemu_irq flash_cs;
- flash = qdev_new(flash_type);
+ flash = qdev_new_orphan(flash_type);
if (dinfo) {
qdev_prop_set_drive(flash, "drive", blk_by_legacy_dinfo(dinfo));
}
@@ -113,7 +113,7 @@ static void sdhci_attach_drive(SDHCIState *sdhci, int unit)
exit(1);
}
- DeviceState *carddev = qdev_new(TYPE_SD_CARD);
+ DeviceState *carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev, bus, &error_fatal);
}
diff --git a/hw/arm/npcm8xx_boards.c b/hw/arm/npcm8xx_boards.c
index 042a928857..10df2d614c 100644
--- a/hw/arm/npcm8xx_boards.c
+++ b/hw/arm/npcm8xx_boards.c
@@ -61,7 +61,7 @@ static void npcm8xx_connect_flash(NPCM7xxFIUState *fiu, int cs_no,
DeviceState *flash;
qemu_irq flash_cs;
- flash = qdev_new(flash_type);
+ flash = qdev_new_orphan(flash_type);
if (dinfo) {
qdev_prop_set_drive(flash, "drive", blk_by_legacy_dinfo(dinfo));
}
diff --git a/hw/arm/olimex-stm32-h405.c b/hw/arm/olimex-stm32-h405.c
index e801e4308e..70f7791695 100644
--- a/hw/arm/olimex-stm32-h405.c
+++ b/hw/arm/olimex-stm32-h405.c
@@ -47,7 +47,7 @@ static void olimex_stm32_h405_init(MachineState *machine)
sysclk = clock_new(OBJECT(machine), "SYSCLK");
clock_set_hz(sysclk, SYSCLK_FRQ);
- dev = qdev_new(TYPE_STM32F405_SOC);
+ dev = qdev_new_orphan(TYPE_STM32F405_SOC);
object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
qdev_connect_clock_in(dev, "sysclk", sysclk);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index 44f9dd67c3..9115d12fad 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -3763,7 +3763,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
omap_clkm_init(system_memory, 0xfffece00, 0xe1008000, s);
- s->ih[0] = qdev_new("omap-intc");
+ s->ih[0] = qdev_new_orphan("omap-intc");
qdev_prop_set_uint32(s->ih[0], "size", 0x100);
omap_intc_set_iclk(OMAP_INTC(s->ih[0]), omap_findclk(s, "arminth_ck"));
busdev = SYS_BUS_DEVICE(s->ih[0]);
@@ -3773,7 +3773,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
sysbus_connect_irq(busdev, 1,
qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_FIQ));
sysbus_mmio_map(busdev, 0, 0xfffecb00);
- s->ih[1] = qdev_new("omap-intc");
+ s->ih[1] = qdev_new_orphan("omap-intc");
qdev_prop_set_uint32(s->ih[1], "size", 0x800);
omap_intc_set_iclk(OMAP_INTC(s->ih[1]), omap_findclk(s, "arminth_ck"));
busdev = SYS_BUS_DEVICE(s->ih[1]);
@@ -3876,7 +3876,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
warn_report("missing SecureDigital device");
}
- s->mmc = qdev_new(TYPE_OMAP_MMC);
+ s->mmc = qdev_new_orphan(TYPE_OMAP_MMC);
sysbus_realize_and_unref(SYS_BUS_DEVICE(s->mmc), &error_fatal);
omap_mmc_set_clk(s->mmc, omap_findclk(s, "mmc_ck"));
@@ -3888,7 +3888,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
qdev_get_gpio_in(s->ih[1], OMAP_INT_OQN));
if (dinfo) {
- DeviceState *card = qdev_new(TYPE_SD_CARD);
+ DeviceState *card = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
qdev_realize_and_unref(card, qdev_get_child_bus(s->mmc, "sd-bus"),
@@ -3900,7 +3900,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
qdev_get_gpio_in(s->ih[1], OMAP_INT_MPUIO),
omap_findclk(s, "clk32-kHz"));
- s->gpio = qdev_new("omap-gpio");
+ s->gpio = qdev_new_orphan("omap-gpio");
omap_gpio_set_clk(OMAP1_GPIO(s->gpio), omap_findclk(s, "arm_gpio_ck"));
sysbus_realize_and_unref(SYS_BUS_DEVICE(s->gpio), &error_fatal);
sysbus_connect_irq(SYS_BUS_DEVICE(s->gpio), 0,
@@ -3917,7 +3917,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
s->pwt = omap_pwt_init(system_memory, 0xfffb6000,
omap_findclk(s, "armxor_ck"));
- s->i2c[0] = qdev_new("omap_i2c");
+ s->i2c[0] = qdev_new_orphan("omap_i2c");
qdev_prop_set_uint8(s->i2c[0], "revision", 0x11);
omap_i2c_set_fclk(OMAP_I2C(s->i2c[0]), omap_findclk(s, "mpuper_ck"));
busdev = SYS_BUS_DEVICE(s->i2c[0]);
diff --git a/hw/arm/orangepi.c b/hw/arm/orangepi.c
index d84443bb7b..d705cc43b4 100644
--- a/hw/arm/orangepi.c
+++ b/hw/arm/orangepi.c
@@ -85,7 +85,7 @@ static void orangepi_init(MachineState *machine)
bus = qdev_get_child_bus(DEVICE(h3), "sd-bus");
/* Plug in SD card */
- carddev = qdev_new(TYPE_SD_CARD);
+ carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev, bus, &error_fatal);
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 3f99e87428..2d5f51506d 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -283,7 +283,7 @@ void raspi_base_machine_init(MachineState *machine,
error_report("No SD bus found in SOC object");
exit(1);
}
- carddev = qdev_new(TYPE_SD_CARD);
+ carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev, bus, &error_fatal);
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index 2b9f3271d6..0fce9b624f 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -61,7 +61,7 @@ static const int realview_board_id[] = {
static void split_irq_from_named(DeviceState *src, const char* outname,
qemu_irq out1, qemu_irq out2) {
- DeviceState *splitter = qdev_new(TYPE_SPLIT_IRQ);
+ DeviceState *splitter = qdev_new_orphan(TYPE_SPLIT_IRQ);
qdev_prop_set_uint32(splitter, "num-lines", 2);
@@ -180,7 +180,7 @@ static void realview_init(MachineState *machine,
}
sys_id = is_pb ? 0x01780500 : 0xc1400400;
- sysctl = qdev_new("realview_sysctl");
+ sysctl = qdev_new_orphan("realview_sysctl");
qdev_prop_set_uint32(sysctl, "sys_id", sys_id);
qdev_prop_set_uint32(sysctl, "proc_id", proc_id);
sysbus_realize_and_unref(SYS_BUS_DEVICE(sysctl), &error_fatal);
@@ -188,10 +188,10 @@ static void realview_init(MachineState *machine,
if (is_mpcore) {
if (is_pb) {
- dev = qdev_new(TYPE_A9MPCORE_PRIV);
+ dev = qdev_new_orphan(TYPE_A9MPCORE_PRIV);
qdev_prop_set_uint32(dev, "num-irq", GIC_EXT_IRQS + GIC_INTERNAL);
} else {
- dev = qdev_new("realview_mpcore");
+ dev = qdev_new_orphan("realview_mpcore");
}
qdev_prop_set_uint32(dev, "num-cpu", smp_cpus);
busdev = SYS_BUS_DEVICE(dev);
@@ -212,7 +212,7 @@ static void realview_init(MachineState *machine,
pic[n] = qdev_get_gpio_in(dev, n);
}
- pl041 = qdev_new("pl041");
+ pl041 = qdev_new_orphan("pl041");
qdev_prop_set_uint32(pl041, "nc_fifo_depth", 512);
if (machine->audiodev) {
qdev_prop_set_string(pl041, "audiodev", machine->audiodev);
@@ -230,7 +230,7 @@ static void realview_init(MachineState *machine,
pl011_create(0x1000c000, pic[15], serial_hd(3));
/* DMA controller is optional, apparently. */
- dev = qdev_new("pl081");
+ dev = qdev_new_orphan("pl081");
object_property_set_link(OBJECT(dev), "downstream", OBJECT(sysmem),
&error_fatal);
busdev = SYS_BUS_DEVICE(dev);
@@ -245,7 +245,7 @@ static void realview_init(MachineState *machine,
sysbus_create_simple("pl061", 0x10014000, pic[7]);
gpio2 = sysbus_create_simple("pl061", 0x10015000, pic[8]);
- dev = qdev_new("pl111");
+ dev = qdev_new_orphan("pl111");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
OBJECT(sysmem), &error_fatal);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -271,7 +271,7 @@ static void realview_init(MachineState *machine,
if (dinfo) {
DeviceState *card;
- card = qdev_new(TYPE_SD_CARD);
+ card = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
qdev_realize_and_unref(card, qdev_get_child_bus(dev, "sd-bus"),
@@ -281,7 +281,7 @@ static void realview_init(MachineState *machine,
sysbus_create_simple("pl031", 0x10017000, pic[10]);
if (!is_pb) {
- dev = qdev_new("realview_pci");
+ dev = qdev_new_orphan("realview_pci");
busdev = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, 0x10019000); /* PCI controller registers */
diff --git a/hw/arm/sabrelite.c b/hw/arm/sabrelite.c
index 84bbc2f979..af4dfef7f2 100644
--- a/hw/arm/sabrelite.c
+++ b/hw/arm/sabrelite.c
@@ -96,7 +96,7 @@ static void sabrelite_init(MachineState *machine)
qemu_irq cs_line;
DriveInfo *dinfo = drive_get(IF_MTD, 0, 0);
- flash_dev = qdev_new("sst25vf016b");
+ flash_dev = qdev_new_orphan("sst25vf016b");
if (dinfo) {
qdev_prop_set_drive_err(flash_dev, "drive",
blk_by_legacy_dinfo(dinfo),
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
index 484b90053e..47a1a82a39 100644
--- a/hw/arm/sbsa-ref.c
+++ b/hw/arm/sbsa-ref.c
@@ -296,7 +296,7 @@ static PFlashCFI01 *sbsa_flash_create1(SBSAMachineState *sms,
* Create a single flash device. We use the same parameters as
* the flash devices on the Versatile Express board.
*/
- DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
qdev_prop_set_uint64(dev, "sector-length", SBSA_FLASH_SECTOR_SIZE);
qdev_prop_set_uint8(dev, "width", 4);
@@ -421,7 +421,7 @@ static void create_its(SBSAMachineState *sms)
const char *itsclass = its_class_name();
DeviceState *dev;
- dev = qdev_new(itsclass);
+ dev = qdev_new_orphan(itsclass);
object_property_set_link(OBJECT(dev), "parent-gicv3", OBJECT(sms->gic),
&error_abort);
@@ -440,7 +440,7 @@ static void create_gic(SBSAMachineState *sms, MemoryRegion *mem)
gictype = gicv3_class_name();
- sms->gic = qdev_new(gictype);
+ sms->gic = qdev_new_orphan(gictype);
qdev_prop_set_uint32(sms->gic, "revision", 3);
qdev_prop_set_uint32(sms->gic, "num-cpu", smp_cpus);
/*
@@ -522,7 +522,7 @@ static void create_uart(const SBSAMachineState *sms, int uart,
{
hwaddr base = sbsa_ref_memmap[uart].base;
int irq = sbsa_ref_irqmap[uart];
- DeviceState *dev = qdev_new(TYPE_PL011);
+ DeviceState *dev = qdev_new_orphan(TYPE_PL011);
SysBusDevice *s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", chr);
@@ -544,7 +544,7 @@ static void create_wdt(const SBSAMachineState *sms)
{
hwaddr rbase = sbsa_ref_memmap[SBSA_GWDT_REFRESH].base;
hwaddr cbase = sbsa_ref_memmap[SBSA_GWDT_CONTROL].base;
- DeviceState *dev = qdev_new(TYPE_WDT_SBSA);
+ DeviceState *dev = qdev_new_orphan(TYPE_WDT_SBSA);
SysBusDevice *s = SYS_BUS_DEVICE(dev);
int irq = sbsa_ref_irqmap[SBSA_GWDT_WS0];
@@ -590,7 +590,7 @@ static void create_ahci(const SBSAMachineState *sms)
DriveInfo *hd[NUM_SATA_PORTS];
SysbusAHCIState *sysahci;
- dev = qdev_new("sysbus-ahci");
+ dev = qdev_new_orphan("sysbus-ahci");
qdev_prop_set_uint32(dev, "num-ports", NUM_SATA_PORTS);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
@@ -605,7 +605,7 @@ static void create_xhci(const SBSAMachineState *sms)
{
hwaddr base = sbsa_ref_memmap[SBSA_XHCI].base;
int irq = sbsa_ref_irqmap[SBSA_XHCI];
- DeviceState *dev = qdev_new(TYPE_XHCI_SYSBUS);
+ DeviceState *dev = qdev_new_orphan(TYPE_XHCI_SYSBUS);
qdev_prop_set_uint32(dev, "slots", XHCI_MAXSLOTS);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -622,7 +622,7 @@ static void create_smmu(const SBSAMachineState *sms, PCIBus *bus,
DeviceState *dev;
int i;
- dev = qdev_new(TYPE_ARM_SMMUV3);
+ dev = qdev_new_orphan(TYPE_ARM_SMMUV3);
object_property_set_str(OBJECT(dev), "stage", "nested", &error_abort);
object_property_set_link(OBJECT(dev), "primary-bus", OBJECT(bus),
@@ -658,7 +658,7 @@ static void create_pcie(SBSAMachineState *sms,
PCIHostState *pci;
int i;
- dev = qdev_new(TYPE_GPEX_HOST);
+ dev = qdev_new_orphan(TYPE_GPEX_HOST);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
/* Map ECAM space */
@@ -712,7 +712,7 @@ static void *sbsa_ref_dtb(const struct arm_boot_info *binfo, int *fdt_size)
static void create_secure_ec(MemoryRegion *mem)
{
hwaddr base = sbsa_ref_memmap[SBSA_SECURE_EC].base;
- DeviceState *dev = qdev_new("sbsa-ec");
+ DeviceState *dev = qdev_new_orphan("sbsa-ec");
SysBusDevice *s = SYS_BUS_DEVICE(dev);
memory_region_add_subregion(mem, base,
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index 56ecc828f4..1f816a3965 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1096,7 +1096,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
* Create the system-registers object early, because we will
* need its sysclk output.
*/
- ssys_dev = qdev_new(TYPE_STELLARIS_SYS);
+ ssys_dev = qdev_new_orphan(TYPE_STELLARIS_SYS);
object_property_add_child(soc_container, "sys", OBJECT(ssys_dev));
/*
@@ -1123,7 +1123,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
qdev_prop_set_uint32(ssys_dev, "dc4", board->dc4);
sysbus_realize_and_unref(SYS_BUS_DEVICE(ssys_dev), &error_fatal);
- armv7m = qdev_new(TYPE_ARMV7M);
+ armv7m = qdev_new_orphan(TYPE_ARMV7M);
object_property_add_child(soc_container, "v7m", OBJECT(armv7m));
qdev_prop_set_uint32(armv7m, "num-irq", NUM_IRQ_LINES);
qdev_prop_set_uint8(armv7m, "num-prio-bits", NUM_PRIO_BITS);
@@ -1157,7 +1157,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
if (DEV_CAP(2, GPTM(i))) {
SysBusDevice *sbd;
- dev = qdev_new(TYPE_STELLARIS_GPTM);
+ dev = qdev_new_orphan(TYPE_STELLARIS_GPTM);
sbd = SYS_BUS_DEVICE(dev);
object_property_add_child(soc_container, "gptm[*]", OBJECT(dev));
qdev_connect_clock_in(dev, "clk",
@@ -1172,7 +1172,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
}
if (DEV_CAP(1, WDT)) {
- dev = qdev_new(TYPE_LUMINARY_WATCHDOG);
+ dev = qdev_new_orphan(TYPE_LUMINARY_WATCHDOG);
object_property_add_child(soc_container, "wdg", OBJECT(dev));
qdev_connect_clock_in(dev, "WDOGCLK",
qdev_get_clock_out(ssys_dev, "SYSCLK"));
@@ -1216,7 +1216,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
if (DEV_CAP(2, UART(i))) {
SysBusDevice *sbd;
- dev = qdev_new("pl011_luminary");
+ dev = qdev_new_orphan("pl011_luminary");
object_property_add_child(soc_container, "uart[*]", OBJECT(dev));
sbd = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(i));
@@ -1304,18 +1304,18 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
dinfo = drive_get(IF_SD, 0, 0);
blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
- carddev = qdev_new(TYPE_SD_CARD_SPI);
+ carddev = qdev_new_orphan(TYPE_SD_CARD_SPI);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev,
qdev_get_child_bus(sddev, "sd-bus"),
&error_fatal);
- ssddev = qdev_new("ssd0323");
+ ssddev = qdev_new_orphan("ssd0323");
object_property_add_child(OBJECT(ms), "oled", OBJECT(ssddev));
qdev_prop_set_uint8(ssddev, "cs", 1);
qdev_realize_and_unref(ssddev, bus, &error_fatal);
- gpio_d_splitter = qdev_new(TYPE_SPLIT_IRQ);
+ gpio_d_splitter = qdev_new_orphan(TYPE_SPLIT_IRQ);
object_property_add_child(OBJECT(ms), "splitter",
OBJECT(gpio_d_splitter));
qdev_prop_set_uint32(gpio_d_splitter, "num-lines", 2);
@@ -1337,7 +1337,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
if (DEV_CAP(4, EMAC)) {
DeviceState *enet;
- enet = qdev_new("stellaris_enet");
+ enet = qdev_new_orphan("stellaris_enet");
object_property_add_child(soc_container, "enet", OBJECT(enet));
if (nd) {
qdev_set_nic_properties(enet, nd);
@@ -1357,7 +1357,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
};
DeviceState *gpad;
- gpad = qdev_new(TYPE_STELLARIS_GAMEPAD);
+ gpad = qdev_new_orphan(TYPE_STELLARIS_GAMEPAD);
object_property_add_child(OBJECT(ms), "gamepad", OBJECT(gpad));
for (i = 0; i < ARRAY_SIZE(gpad_keycode); i++) {
qlist_append_int(gpad_keycode_list, gpad_keycode[i]);
diff --git a/hw/arm/stm32vldiscovery.c b/hw/arm/stm32vldiscovery.c
index 8f93c0036a..8c37d41e63 100644
--- a/hw/arm/stm32vldiscovery.c
+++ b/hw/arm/stm32vldiscovery.c
@@ -47,7 +47,7 @@ static void stm32vldiscovery_init(MachineState *machine)
sysclk = clock_new(OBJECT(machine), "SYSCLK");
clock_set_hz(sysclk, SYSCLK_FRQ);
- dev = qdev_new(TYPE_STM32F100_SOC);
+ dev = qdev_new_orphan(TYPE_STM32F100_SOC);
object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
qdev_connect_clock_in(dev, "sysclk", sysclk);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
index 5a3242195a..0c6b04f805 100644
--- a/hw/arm/strongarm.c
+++ b/hw/arm/strongarm.c
@@ -646,7 +646,7 @@ static DeviceState *strongarm_gpio_init(hwaddr base,
DeviceState *dev;
int i;
- dev = qdev_new(TYPE_STRONGARM_GPIO);
+ dev = qdev_new_orphan(TYPE_STRONGARM_GPIO);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
@@ -1642,7 +1642,7 @@ StrongARMState *sa1110_init(const char *cpu_type)
s->ppc = sysbus_create_varargs(TYPE_STRONGARM_PPC, 0x90060000, NULL);
for (i = 0; sa_serial[i].io_base; i++) {
- DeviceState *dev = qdev_new(TYPE_STRONGARM_UART);
+ DeviceState *dev = qdev_new_orphan(TYPE_STRONGARM_UART);
qdev_prop_set_chr(dev, "chardev", serial_hd(i));
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0,
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index c6991a52e6..5e9d76859f 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -226,7 +226,7 @@ static void versatile_init(MachineState *machine, int board_id)
/* SDRAM at address zero. */
memory_region_add_subregion(sysmem, 0, machine->ram);
- sysctl = qdev_new("realview_sysctl");
+ sysctl = qdev_new_orphan("realview_sysctl");
qdev_prop_set_uint32(sysctl, "sys_id", 0x41007004);
qdev_prop_set_uint32(sysctl, "proc_id", 0x02000000);
sysbus_realize_and_unref(SYS_BUS_DEVICE(sysctl), &error_fatal);
@@ -248,7 +248,7 @@ static void versatile_init(MachineState *machine, int board_id)
sysbus_create_simple("pl050_keyboard", 0x10006000, sic[3]);
sysbus_create_simple("pl050_mouse", 0x10007000, sic[4]);
- dev = qdev_new("versatile_pci");
+ dev = qdev_new_orphan("versatile_pci");
busdev = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, 0x10001000); /* PCI controller regs */
@@ -284,7 +284,7 @@ static void versatile_init(MachineState *machine, int board_id)
pl011_create(0x101f3000, pic[14], serial_hd(2));
pl011_create(0x10009000, sic[6], serial_hd(3));
- dev = qdev_new("pl080");
+ dev = qdev_new_orphan("pl080");
object_property_set_link(OBJECT(dev), "downstream", OBJECT(sysmem),
&error_fatal);
busdev = SYS_BUS_DEVICE(dev);
@@ -302,7 +302,7 @@ static void versatile_init(MachineState *machine, int board_id)
/* The versatile/PB actually has a modified Color LCD controller
that includes hardware cursor support from the PL111. */
- dev = qdev_new("pl110_versatile");
+ dev = qdev_new_orphan("pl110_versatile");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
OBJECT(sysmem), &error_fatal);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -317,7 +317,7 @@ static void versatile_init(MachineState *machine, int board_id)
if (dinfo) {
DeviceState *card;
- card = qdev_new(TYPE_SD_CARD);
+ card = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
qdev_realize_and_unref(card, qdev_get_child_bus(dev, "sd-bus"),
@@ -329,7 +329,7 @@ static void versatile_init(MachineState *machine, int board_id)
if (dinfo) {
DeviceState *card;
- card = qdev_new(TYPE_SD_CARD);
+ card = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
qdev_realize_and_unref(card, qdev_get_child_bus(dev, "sd-bus"),
@@ -344,7 +344,7 @@ static void versatile_init(MachineState *machine, int board_id)
i2c_slave_create_simple(i2c, "ds1338", 0x68);
/* Add PL041 AACI Interface to the LM4549 codec */
- pl041 = qdev_new("pl041");
+ pl041 = qdev_new_orphan("pl041");
qdev_prop_set_uint32(pl041, "nc_fifo_depth", 512);
if (machine->audiodev) {
qdev_prop_set_string(pl041, "audiodev", machine->audiodev);
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index f26d8c6f8d..716f55a086 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -241,7 +241,7 @@ static void init_cpus(MachineState *ms, const char *cpu_type,
* this must happen after the CPUs are created because a15mpcore_priv
* wires itself up to the CPU's generic_timer gpio out lines.
*/
- dev = qdev_new(privdev);
+ dev = qdev_new_orphan(privdev);
qdev_prop_set_uint32(dev, "num-cpu", smp_cpus);
qdev_prop_set_uint32(dev, "num-irq", GIC_EXT_IRQS + GIC_INTERNAL);
busdev = SYS_BUS_DEVICE(dev);
@@ -301,7 +301,7 @@ static void a9_daughterboard_init(VexpressMachineState *vms,
/* Daughterboard peripherals : 0x10020000 .. 0x20000000 */
/* 0x10020000 PL111 CLCD (daughterboard) */
- dev = qdev_new("pl111");
+ dev = qdev_new_orphan("pl111");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
OBJECT(sysmem), &error_fatal);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -517,7 +517,7 @@ static void vexpress_modify_dtb(const struct arm_boot_info *info, void *fdt)
static PFlashCFI01 *ve_pflash_cfi01_register(hwaddr base, const char *name,
DriveInfo *di)
{
- DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
if (di) {
qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(di));
@@ -592,7 +592,7 @@ static void vexpress_common_init(MachineState *machine)
sys_id = 0x1190f500;
- sysctl = qdev_new("realview_sysctl");
+ sysctl = qdev_new_orphan("realview_sysctl");
qdev_prop_set_uint32(sysctl, "sys_id", sys_id);
qdev_prop_set_uint32(sysctl, "proc_id", daughterboard->proc_id);
@@ -614,7 +614,7 @@ static void vexpress_common_init(MachineState *machine)
/* VE_SP810: not modelled */
/* VE_SERIALPCI: not modelled */
- pl041 = qdev_new("pl041");
+ pl041 = qdev_new_orphan("pl041");
qdev_prop_set_uint32(pl041, "nc_fifo_depth", 512);
if (machine->audiodev) {
qdev_prop_set_string(pl041, "audiodev", machine->audiodev);
@@ -633,7 +633,7 @@ static void vexpress_common_init(MachineState *machine)
if (dinfo) {
DeviceState *card;
- card = qdev_new(TYPE_SD_CARD);
+ card = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
qdev_realize_and_unref(card, qdev_get_child_bus(dev, "sd-bus"),
@@ -659,7 +659,7 @@ static void vexpress_common_init(MachineState *machine)
/* VE_COMPACTFLASH: not modelled */
- dev = qdev_new("pl111");
+ dev = qdev_new_orphan("pl111");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
OBJECT(sysmem), &error_fatal);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 6a3c69ba8f..3f62c8fc2d 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1082,7 +1082,7 @@ static inline DeviceState *create_acpi_ged(VirtMachineState *vms)
event |= ACPI_GED_NVDIMM_HOTPLUG_EVT;
}
- dev = qdev_new(TYPE_ACPI_GED);
+ dev = qdev_new_orphan(TYPE_ACPI_GED);
qdev_prop_set_uint32(dev, "ged-event", event);
object_property_set_link(OBJECT(dev), "bus", OBJECT(vms->bus), &error_abort);
sbdev = SYS_BUS_DEVICE(dev);
@@ -1120,7 +1120,7 @@ static void create_its(VirtMachineState *vms)
return;
}
- dev = qdev_new(its_class_name());
+ dev = qdev_new_orphan(its_class_name());
object_property_set_link(OBJECT(dev), "parent-gicv3", OBJECT(vms->gic),
&error_abort);
@@ -1137,7 +1137,7 @@ static void create_v2m(VirtMachineState *vms)
int irq = vms->irqmap[VIRT_GIC_V2M];
DeviceState *dev;
- dev = qdev_new("arm-gicv2m");
+ dev = qdev_new_orphan("arm-gicv2m");
qdev_prop_set_uint32(dev, "base-spi", irq);
qdev_prop_set_uint32(dev, "num-spi", NUM_GICV2M_SPIS);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -1225,7 +1225,7 @@ static void create_gicv5(VirtMachineState *vms, MemoryRegion *mem)
const char *gictype = gicv5_class_name();
QList *cpulist = qlist_new(), *iaffidlist = qlist_new();
- vms->gic = qdev_new(gictype);
+ vms->gic = qdev_new_orphan(gictype);
qdev_prop_set_uint32(vms->gic, "spi-range", NUM_IRQS);
object_property_set_link(OBJECT(vms->gic), "sysmem", OBJECT(mem),
@@ -1356,7 +1356,7 @@ static void create_gicv2(VirtMachineState *vms, MemoryRegion *mem)
exit(1);
}
- vms->gic = qdev_new(gic_class_name());
+ vms->gic = qdev_new_orphan(gic_class_name());
qdev_prop_set_uint32(vms->gic, "revision", 2);
qdev_prop_set_uint32(vms->gic, "num-cpu", smp_cpus);
/*
@@ -1412,7 +1412,7 @@ static void create_gicv3(VirtMachineState *vms, MemoryRegion *mem)
exit(1);
}
- vms->gic = qdev_new(gicv3_class_name());
+ vms->gic = qdev_new_orphan(gicv3_class_name());
qdev_prop_set_uint32(vms->gic, "revision", revision);
qdev_prop_set_uint32(vms->gic, "num-cpu", smp_cpus);
/*
@@ -1509,7 +1509,7 @@ static void create_uart(const VirtMachineState *vms, int uart,
int irq = vms->irqmap[uart];
const char compat[] = "arm,pl011\0arm,primecell";
const char clocknames[] = "uartclk\0apb_pclk";
- DeviceState *dev = qdev_new(TYPE_PL011);
+ DeviceState *dev = qdev_new_orphan(TYPE_PL011);
SysBusDevice *s = SYS_BUS_DEVICE(dev);
MachineState *ms = MACHINE(vms);
@@ -1670,7 +1670,7 @@ static void create_gpio_devices(const VirtMachineState *vms, int gpio,
SysBusDevice *s;
MachineState *ms = MACHINE(vms);
- pl061_dev = qdev_new("pl061");
+ pl061_dev = qdev_new_orphan("pl061");
/* Pull lines down to 0 if not driven by the PL061 */
qdev_prop_set_uint8(pl061_dev, "pullups", 0);
qdev_prop_set_uint8(pl061_dev, "pulldowns", 0xff);
@@ -1786,7 +1786,7 @@ static PFlashCFI01 *virt_flash_create1(VirtMachineState *vms,
* Create a single flash device. We use the same parameters as
* the flash devices on the Versatile Express board.
*/
- DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE);
qdev_prop_set_uint8(dev, "width", 4);
@@ -2069,7 +2069,7 @@ static void create_smmu(const VirtMachineState *vms, PCIBus *bus)
return;
}
- dev = qdev_new(TYPE_ARM_SMMUV3);
+ dev = qdev_new_orphan(TYPE_ARM_SMMUV3);
if (!vmc->no_nested_smmu) {
object_property_set_str(OBJECT(dev), "stage", "nested", &error_fatal);
@@ -2162,7 +2162,7 @@ static void create_pcie(VirtMachineState *vms)
MachineState *ms = MACHINE(vms);
MachineClass *mc = MACHINE_GET_CLASS(ms);
- dev = qdev_new(TYPE_GPEX_HOST);
+ dev = qdev_new_orphan(TYPE_GPEX_HOST);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
ecam_id = VIRT_ECAM_ID(vms->highmem_ecam);
@@ -2290,7 +2290,7 @@ static void create_platform_bus(VirtMachineState *vms)
int i;
MemoryRegion *sysmem = get_system_memory();
- dev = qdev_new(TYPE_PLATFORM_BUS_DEVICE);
+ dev = qdev_new_orphan(TYPE_PLATFORM_BUS_DEVICE);
dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE);
qdev_prop_set_uint32(dev, "num_irqs", PLATFORM_BUS_NUM_IRQS);
qdev_prop_set_uint32(dev, "mmio_size", vms->memmap[VIRT_PLATFORM_BUS].size);
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 6c83439017..8c3b47d07a 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -110,7 +110,7 @@ static void gem_init(uint32_t base, qemu_irq irq)
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new(TYPE_CADENCE_GEM);
+ dev = qdev_new_orphan(TYPE_CADENCE_GEM);
qemu_configure_nic_device(dev, true, NULL);
object_property_set_int(OBJECT(dev), "phy-addr", 7, &error_abort);
s = SYS_BUS_DEVICE(dev);
@@ -131,7 +131,7 @@ static inline int zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
int num_busses = is_qspi ? NUM_QSPI_BUSSES : 1;
int num_ss = is_qspi ? NUM_QSPI_FLASHES : NUM_SPI_FLASHES;
- dev = qdev_new(is_qspi ? "xlnx.ps7-qspi" : "xlnx.ps7-spi");
+ dev = qdev_new_orphan(is_qspi ? "xlnx.ps7-qspi" : "xlnx.ps7-spi");
qdev_prop_set_uint8(dev, "num-txrx-bytes", is_qspi ? 4 : 1);
qdev_prop_set_uint8(dev, "num-ss-bits", num_ss);
qdev_prop_set_uint8(dev, "num-busses", num_busses);
@@ -152,7 +152,7 @@ static inline int zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
for (j = 0; j < num_ss; ++j) {
DriveInfo *dinfo = drive_get(IF_MTD, 0, unit++);
- flash_dev = qdev_new("n25q128");
+ flash_dev = qdev_new_orphan("n25q128");
if (dinfo) {
qdev_prop_set_drive_err(flash_dev, "drive",
blk_by_legacy_dinfo(dinfo),
@@ -195,7 +195,7 @@ static void ddr_ctrl_init(uint32_t base)
DeviceState *dev;
SysBusDevice *busdev;
- dev = qdev_new("zynq.ddr-ctlr");
+ dev = qdev_new_orphan("zynq.ddr-ctlr");
busdev = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, base);
@@ -256,13 +256,13 @@ static void zynq_init(MachineState *machine)
clock_set_hz(zynq_machine->ps_clk, PS_CLK_FREQUENCY);
/* Create slcr, keep a pointer to connect clocks */
- slcr = qdev_new("xilinx-zynq_slcr");
+ slcr = qdev_new_orphan("xilinx-zynq_slcr");
qdev_connect_clock_in(slcr, "ps_clk", zynq_machine->ps_clk);
qdev_prop_set_uint8(slcr, "boot-mode", zynq_machine->boot_mode);
sysbus_realize_and_unref(SYS_BUS_DEVICE(slcr), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(slcr), 0, 0xF8000000);
- dev = qdev_new(TYPE_A9MPCORE_PRIV);
+ dev = qdev_new_orphan(TYPE_A9MPCORE_PRIV);
qdev_prop_set_uint32(dev, "num-cpu", smp_cpus);
qdev_prop_set_uint32(dev, "num-irq", GIC_EXT_IRQS + GIC_INTERNAL);
busdev = SYS_BUS_DEVICE(dev);
@@ -290,7 +290,7 @@ static void zynq_init(MachineState *machine)
sysbus_create_simple(TYPE_CHIPIDEA, 0xE0002000, pic[53 - GIC_INTERNAL]);
sysbus_create_simple(TYPE_CHIPIDEA, 0xE0003000, pic[76 - GIC_INTERNAL]);
- dev = qdev_new(TYPE_CADENCE_UART);
+ dev = qdev_new_orphan(TYPE_CADENCE_UART);
busdev = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
qdev_connect_clock_in(dev, "refclk",
@@ -298,7 +298,7 @@ static void zynq_init(MachineState *machine)
sysbus_realize_and_unref(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, 0xE0000000);
sysbus_connect_irq(busdev, 0, pic[59 - GIC_INTERNAL]);
- dev = qdev_new(TYPE_CADENCE_UART);
+ dev = qdev_new_orphan(TYPE_CADENCE_UART);
busdev = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(1));
qdev_connect_clock_in(dev, "refclk",
@@ -329,7 +329,7 @@ static void zynq_init(MachineState *machine)
* - SDIO Specification Version 2.0
* - MMC Specification Version 3.31
*/
- dev = qdev_new(TYPE_SYSBUS_SDHCI);
+ dev = qdev_new_orphan(TYPE_SYSBUS_SDHCI);
qdev_prop_set_uint8(dev, "sd-spec-version", 2);
qdev_prop_set_uint64(dev, "capareg", ZYNQ_SDHCI_CAPABILITIES);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -338,18 +338,18 @@ static void zynq_init(MachineState *machine)
di = drive_get(IF_SD, 0, n);
blk = di ? blk_by_legacy_dinfo(di) : NULL;
- carddev = qdev_new(TYPE_SD_CARD);
+ carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev, qdev_get_child_bus(dev, "sd-bus"),
&error_fatal);
}
- dev = qdev_new(TYPE_ZYNQ_XADC);
+ dev = qdev_new_orphan(TYPE_ZYNQ_XADC);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0xF8007100);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[39-GIC_INTERNAL]);
- dev = qdev_new("pl330");
+ dev = qdev_new_orphan("pl330");
object_property_set_link(OBJECT(dev), "memory",
OBJECT(address_space_mem),
&error_fatal);
@@ -372,7 +372,7 @@ static void zynq_init(MachineState *machine)
sysbus_connect_irq(busdev, n + 1, pic[dma_irqs[n] - GIC_INTERNAL]);
}
- dev = qdev_new("xlnx.ps7-dev-cfg");
+ dev = qdev_new_orphan("xlnx.ps7-dev-cfg");
busdev = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(busdev, &error_fatal);
sysbus_connect_irq(busdev, 0, pic[40 - GIC_INTERNAL]);
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
index 2b04513ba2..48f6e6d463 100644
--- a/hw/arm/xlnx-versal-virt.c
+++ b/hw/arm/xlnx-versal-virt.c
@@ -143,7 +143,7 @@ static void create_virtio_regions(VersalVirt *s)
qemu_irq pic_irq;
pic_irq = versal_get_reserved_irq(&s->soc, i, &dtb_irq);
- dev = qdev_new("virtio-mmio");
+ dev = qdev_new_orphan("virtio-mmio");
object_property_add_child(OBJECT(s), "virtio-mmio[*]", OBJECT(dev));
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic_irq);
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
index facf92b45c..7cb95a4ff8 100644
--- a/hw/arm/xlnx-versal.c
+++ b/hw/arm/xlnx-versal.c
@@ -514,7 +514,7 @@ static qemu_irq versal_get_gic_irq(Versal *s, int irq_idx)
if (split == NULL) {
size_t i;
- split = qdev_new(TYPE_SPLIT_IRQ);
+ split = qdev_new_orphan(TYPE_SPLIT_IRQ);
qdev_prop_set_uint16(split, "num-lines", s->intc->len);
object_property_add_child(container, name, OBJECT(split));
qdev_realize_and_unref(split, NULL, &error_abort);
@@ -562,7 +562,7 @@ static qemu_irq versal_get_irq_or_gate_in(Versal *s, int irq_idx,
dev = DEVICE(object_resolve_path_at(container, name));
if (dev == NULL) {
- dev = qdev_new(TYPE_OR_IRQ);
+ dev = qdev_new_orphan(TYPE_OR_IRQ);
object_property_add_child(container, name, OBJECT(dev));
qdev_prop_set_uint16(dev, "num-lines", 1 << R_VERSAL_IRQ_OR_IDX_LENGTH);
qdev_realize_and_unref(dev, NULL, &error_abort);
@@ -664,7 +664,7 @@ static inline DeviceState *create_or_gate(Versal *s, Object *parent,
{
DeviceState *or;
- or = qdev_new(TYPE_OR_IRQ);
+ or = qdev_new_orphan(TYPE_OR_IRQ);
qdev_prop_set_uint16(or, "num-lines", num_lines);
object_property_add_child(parent, name, OBJECT(or));
qdev_realize_and_unref(or, NULL, &error_abort);
@@ -713,7 +713,7 @@ static void versal_create_gic_its(Versal *s,
return;
}
- dev = qdev_new(TYPE_ARM_GICV3_ITS);
+ dev = qdev_new_orphan(TYPE_ARM_GICV3_ITS);
sbd = SYS_BUS_DEVICE(dev);
object_property_add_child(OBJECT(gic), "its", OBJECT(dev));
@@ -755,11 +755,11 @@ static DeviceState *versal_create_gic(Versal *s,
switch (map->gic.version) {
case 2:
- dev = qdev_new(gic_class_name());
+ dev = qdev_new_orphan(gic_class_name());
break;
case 3:
- dev = qdev_new(gicv3_class_name());
+ dev = qdev_new_orphan(gicv3_class_name());
break;
default:
@@ -909,7 +909,7 @@ static DeviceState *versal_create_cpu(Versal *s,
size_t cluster_idx,
size_t core_idx)
{
- DeviceState *cpu = qdev_new(map->cpu_model);
+ DeviceState *cpu = qdev_new_orphan(map->cpu_model);
ARMCPU *arm_cpu = ARM_CPU(cpu);
Object *obj = OBJECT(cpu);
uint64_t affinity;
@@ -960,7 +960,7 @@ static void versal_create_cpu_cluster(Versal *s, const VersalCpuClusterMap *map)
const char compatible[] = "arm,armv8-timer";
bool has_gtimer;
- cluster = qdev_new(TYPE_CPU_CLUSTER);
+ cluster = qdev_new_orphan(TYPE_CPU_CLUSTER);
name = g_strdup_printf("%s-cluster", map->name);
object_property_add_child(OBJECT(s), name, OBJECT(cluster));
g_free(name);
@@ -1028,7 +1028,7 @@ static void versal_create_uart(Versal *s,
const char compatible[] = "arm,pl011\0arm,sbsa-uart";
const char clocknames[] = "uartclk\0apb_pclk";
- dev = qdev_new(TYPE_PL011);
+ dev = qdev_new_orphan(TYPE_PL011);
object_property_add_child(OBJECT(s), "uart[*]", OBJECT(dev));
qdev_prop_set_chr(dev, "chardev", serial_hd(chardev_idx));
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -1067,7 +1067,7 @@ static void versal_create_canfd(Versal *s, const VersalSimplePeriphMap *map,
const char compatible[] = "xlnx,canfd-2.0";
const char clocknames[] = "can_clk\0s_axi_aclk";
- sbd = SYS_BUS_DEVICE(qdev_new(TYPE_XILINX_CANFD));
+ sbd = SYS_BUS_DEVICE(qdev_new_orphan(TYPE_XILINX_CANFD));
object_property_add_child(OBJECT(s), "canfd[*]", OBJECT(sbd));
object_property_set_int(OBJECT(sbd), "ext_clk_freq",
@@ -1107,7 +1107,7 @@ static void versal_create_usb(Versal *s,
const char compat_versal_dwc3[] = "xlnx,versal-dwc3";
const char compat_dwc3[] = "snps,dwc3";
- dev = qdev_new(TYPE_XILINX_VERSAL_USB2);
+ dev = qdev_new_orphan(TYPE_XILINX_VERSAL_USB2);
object_property_add_child(OBJECT(s), "usb[*]", OBJECT(dev));
object_property_set_link(OBJECT(dev), "dma", OBJECT(&s->mr_ps),
@@ -1167,7 +1167,7 @@ static void versal_create_gem(Versal *s,
DeviceState *or;
int i;
- dev = qdev_new(TYPE_CADENCE_GEM);
+ dev = qdev_new_orphan(TYPE_CADENCE_GEM);
object_property_add_child(OBJECT(s), "gem[*]", OBJECT(dev));
qemu_configure_nic_device(dev, true, NULL);
@@ -1251,7 +1251,7 @@ static void versal_create_zdma(Versal *s,
int irq = map->map.irq + map->irq_stride * i;
g_autofree char *node;
- dev = qdev_new(TYPE_XLNX_ZDMA);
+ dev = qdev_new_orphan(TYPE_XLNX_ZDMA);
object_property_add_child(OBJECT(s), name, OBJECT(dev));
object_property_set_int(OBJECT(dev), "bus-width", 128, &error_abort);
object_property_set_link(OBJECT(dev), "dma",
@@ -1286,7 +1286,7 @@ static void versal_create_sdhci(Versal *s,
const char compatible[] = "arasan,sdhci-8.9a";
const char clocknames[] = "clk_xin\0clk_ahb";
- dev = qdev_new(TYPE_SYSBUS_SDHCI);
+ dev = qdev_new_orphan(TYPE_SYSBUS_SDHCI);
object_property_add_child(OBJECT(s), "sdhci[*]", OBJECT(dev));
object_property_set_uint(OBJECT(dev), "sd-spec-version", 3,
@@ -1320,7 +1320,7 @@ static void versal_create_rtc(Versal *s, const struct VersalRtcMap *map)
const char compatible[] = "xlnx,zynqmp-rtc";
const char interrupt_names[] = "alarm\0sec";
- sbd = SYS_BUS_DEVICE(qdev_new(TYPE_XLNX_ZYNQMP_RTC));
+ sbd = SYS_BUS_DEVICE(qdev_new_orphan(TYPE_XLNX_ZYNQMP_RTC));
object_property_add_child(OBJECT(s), "rtc", OBJECT(sbd));
sysbus_realize_and_unref(sbd, &error_abort);
@@ -1349,7 +1349,7 @@ static void versal_create_trng(Versal *s, const VersalSimplePeriphMap *map)
SysBusDevice *sbd;
MemoryRegion *mr;
- sbd = SYS_BUS_DEVICE(qdev_new(TYPE_XLNX_VERSAL_TRNG));
+ sbd = SYS_BUS_DEVICE(qdev_new_orphan(TYPE_XLNX_VERSAL_TRNG));
object_property_add_child(OBJECT(s), "trng", OBJECT(sbd));
sysbus_realize_and_unref(sbd, &error_abort);
@@ -1370,7 +1370,7 @@ static void versal_create_xrams(Versal *s, const struct VersalXramMap *map)
for (i = 0; i < map->num; i++) {
hwaddr ctrl, mem;
- sbd = SYS_BUS_DEVICE(qdev_new(TYPE_XLNX_XRAM_CTRL));
+ sbd = SYS_BUS_DEVICE(qdev_new_orphan(TYPE_XLNX_XRAM_CTRL));
object_property_add_child(OBJECT(s), "xram[*]", OBJECT(sbd));
sysbus_realize_and_unref(sbd, &error_fatal);
@@ -1392,7 +1392,7 @@ static void versal_create_bbram(Versal *s,
DeviceState *dev;
SysBusDevice *sbd;
- dev = qdev_new(TYPE_XLNX_BBRAM);
+ dev = qdev_new_orphan(TYPE_XLNX_BBRAM);
sbd = SYS_BUS_DEVICE(dev);
object_property_add_child(OBJECT(s), "bbram", OBJECT(dev));
@@ -1415,9 +1415,9 @@ static void versal_create_efuse(Versal *s,
return;
}
- ctrl = qdev_new(TYPE_XLNX_VERSAL_EFUSE_CTRL);
- cache = qdev_new(TYPE_XLNX_VERSAL_EFUSE_CACHE);
- bits = qdev_new(TYPE_XLNX_EFUSE);
+ ctrl = qdev_new_orphan(TYPE_XLNX_VERSAL_EFUSE_CTRL);
+ cache = qdev_new_orphan(TYPE_XLNX_VERSAL_EFUSE_CACHE);
+ bits = qdev_new_orphan(TYPE_XLNX_EFUSE);
qdev_prop_set_uint32(bits, "efuse-nr", 3);
qdev_prop_set_uint32(bits, "efuse-size", 8192);
@@ -1451,7 +1451,7 @@ static DeviceState *versal_create_pmc_iou_slcr(Versal *s,
SysBusDevice *sbd;
DeviceState *dev;
- dev = qdev_new(TYPE_XILINX_VERSAL_PMC_IOU_SLCR);
+ dev = qdev_new_orphan(TYPE_XILINX_VERSAL_PMC_IOU_SLCR);
object_property_add_child(OBJECT(s), "pmc-iou-slcr", OBJECT(dev));
sbd = SYS_BUS_DEVICE(dev);
@@ -1473,7 +1473,7 @@ static DeviceState *versal_create_ospi(Versal *s,
DeviceState *dev, *dma_dst, *dma_src, *orgate;
MemoryRegion *linear_mr = g_new(MemoryRegion, 1);
- dev = qdev_new(TYPE_XILINX_VERSAL_OSPI);
+ dev = qdev_new_orphan(TYPE_XILINX_VERSAL_OSPI);
object_property_add_child(OBJECT(s), "ospi", OBJECT(dev));
memory_region_init(linear_mr, OBJECT(dev), "linear-mr", map->dac_sz);
@@ -1482,7 +1482,7 @@ static DeviceState *versal_create_ospi(Versal *s,
memory_region_add_subregion(linear_mr, 0x0, mr_dac);
/* Create the OSPI destination DMA */
- dma_dst = qdev_new(TYPE_XLNX_CSU_DMA);
+ dma_dst = qdev_new_orphan(TYPE_XLNX_CSU_DMA);
object_property_add_child(OBJECT(dev), "dma-dst-dev", OBJECT(dma_dst));
object_property_set_link(OBJECT(dma_dst), "dma",
OBJECT(get_system_memory()), &error_abort);
@@ -1494,7 +1494,7 @@ static DeviceState *versal_create_ospi(Versal *s,
sysbus_mmio_get_region(sbd, 0));
/* Create the OSPI source DMA */
- dma_src = qdev_new(TYPE_XLNX_CSU_DMA);
+ dma_src = qdev_new_orphan(TYPE_XLNX_CSU_DMA);
object_property_add_child(OBJECT(dev), "dma-src-dev", OBJECT(dma_src));
object_property_set_bool(OBJECT(dma_src), "is-dst", false, &error_abort);
@@ -1548,7 +1548,7 @@ static void versal_create_cfu(Versal *s, const struct VersalCfuMap *map)
object_unref(container);
/* CFU FDRO */
- cfu_fdro = qdev_new(TYPE_XLNX_VERSAL_CFU_FDRO);
+ cfu_fdro = qdev_new_orphan(TYPE_XLNX_VERSAL_CFU_FDRO);
object_property_add_child(container, "cfu-fdro", OBJECT(cfu_fdro));
sbd = SYS_BUS_DEVICE(cfu_fdro);
@@ -1557,15 +1557,15 @@ static void versal_create_cfu(Versal *s, const struct VersalCfuMap *map)
sysbus_mmio_get_region(sbd, 0));
/* cframe bcast */
- cframe_bcast = qdev_new(TYPE_XLNX_VERSAL_CFRAME_BCAST_REG);
+ cframe_bcast = qdev_new_orphan(TYPE_XLNX_VERSAL_CFRAME_BCAST_REG);
object_property_add_child(container, "cframe-bcast", OBJECT(cframe_bcast));
/* CFU APB */
- cfu_apb = qdev_new(TYPE_XLNX_VERSAL_CFU_APB);
+ cfu_apb = qdev_new_orphan(TYPE_XLNX_VERSAL_CFU_APB);
object_property_add_child(container, "cfu-apb", OBJECT(cfu_apb));
/* IRQ or gate for cframes */
- cframe_irq_or = qdev_new(TYPE_OR_IRQ);
+ cframe_irq_or = qdev_new_orphan(TYPE_OR_IRQ);
object_property_add_child(container, "cframe-irq-or-gate",
OBJECT(cframe_irq_or));
qdev_prop_set_uint16(cframe_irq_or, "num-lines", map->num_cframe);
@@ -1580,7 +1580,7 @@ static void versal_create_cfu(Versal *s, const struct VersalCfuMap *map)
g_autofree char *prop_name;
size_t j;
- dev = qdev_new(TYPE_XLNX_VERSAL_CFRAME_REG);
+ dev = qdev_new_orphan(TYPE_XLNX_VERSAL_CFRAME_REG);
object_property_add_child(container, "cframe[*]", OBJECT(dev));
sbd = SYS_BUS_DEVICE(dev);
@@ -1632,7 +1632,7 @@ static void versal_create_cfu(Versal *s, const struct VersalCfuMap *map)
versal_sysbus_connect_irq(s, sbd, 0, map->cfu_apb_irq);
/* CFU SFR */
- cfu_sfr = qdev_new(TYPE_XLNX_VERSAL_CFU_SFR);
+ cfu_sfr = qdev_new_orphan(TYPE_XLNX_VERSAL_CFU_SFR);
object_property_add_child(container, "cfu-sfr", OBJECT(cfu_sfr));
sbd = SYS_BUS_DEVICE(cfu_sfr);
@@ -1676,7 +1676,7 @@ static inline void versal_create_crl(Versal *s)
ver = versal_get_version(s);
crl_class = xlnx_versal_crl_class_name(ver);
- dev = qdev_new(crl_class);
+ dev = qdev_new_orphan(crl_class);
obj = OBJECT(dev);
object_property_add_child(OBJECT(s), "crl", obj);
@@ -1761,7 +1761,7 @@ static void versal_unimp_area(Versal *s, const char *name,
MemoryRegion *mr,
hwaddr base, hwaddr size)
{
- DeviceState *dev = qdev_new(TYPE_UNIMPLEMENTED_DEVICE);
+ DeviceState *dev = qdev_new_orphan(TYPE_UNIMPLEMENTED_DEVICE);
MemoryRegion *mr_dev;
qdev_prop_set_string(dev, "name", name);
@@ -1972,7 +1972,7 @@ void versal_sdhci_plug_card(Versal *s, int sd_idx, BlockBackend *blk)
return;
}
- card = qdev_new(TYPE_SD_CARD);
+ card = qdev_new_orphan(TYPE_SD_CARD);
object_property_add_child(OBJECT(sdhci), "card[*]", OBJECT(card));
qdev_prop_set_drive_err(card, "drive", blk, &error_fatal);
qdev_realize_and_unref(card, qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
@@ -2015,7 +2015,7 @@ void versal_ospi_create_flash(Versal *s, int flash_idx, const char *flash_mdl,
ospi = DEVICE(versal_get_child(s, "ospi"));
spi_bus = qdev_get_child_bus(ospi, "spi0");
- flash = qdev_new(flash_mdl);
+ flash = qdev_new_orphan(flash_mdl);
if (blk) {
qdev_prop_set_drive_err(flash, "drive", blk, &error_fatal);
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
index 4e48970274..adff52eaf6 100644
--- a/hw/arm/xlnx-zcu102.c
+++ b/hw/arm/xlnx-zcu102.c
@@ -187,7 +187,7 @@ static void xlnx_zcu102_init(MachineState *machine)
error_report("No SD bus found for SD card %d", i);
exit(1);
}
- carddev = qdev_new(TYPE_SD_CARD);
+ carddev = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
qdev_realize_and_unref(carddev, bus, &error_fatal);
}
@@ -202,7 +202,7 @@ static void xlnx_zcu102_init(MachineState *machine)
spi_bus = qdev_get_child_bus(DEVICE(&s->soc), bus_name);
g_free(bus_name);
- flash_dev = qdev_new("sst25wf080");
+ flash_dev = qdev_new_orphan("sst25wf080");
if (dinfo) {
qdev_prop_set_drive_err(flash_dev, "drive",
blk_by_legacy_dinfo(dinfo), &error_fatal);
@@ -226,7 +226,7 @@ static void xlnx_zcu102_init(MachineState *machine)
spi_bus = qdev_get_child_bus(DEVICE(&s->soc), bus_name);
g_free(bus_name);
- flash_dev = qdev_new("n25q512a11");
+ flash_dev = qdev_new_orphan("n25q512a11");
if (dinfo) {
qdev_prop_set_drive_err(flash_dev, "drive",
blk_by_legacy_dinfo(dinfo), &error_fatal);
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index 979e55e305..861ee35839 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -365,7 +365,7 @@ static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
for (nr = 0; nr < ARRAY_SIZE(unimp_areas); nr++) {
const struct UnimpInfo *info = &unimp_areas[nr];
- DeviceState *dev = qdev_new(TYPE_UNIMPLEMENTED_DEVICE);
+ DeviceState *dev = qdev_new_orphan(TYPE_UNIMPLEMENTED_DEVICE);
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
assert(info->name && info->base && info->size > 0);
diff --git a/hw/audio/intel-hda.c b/hw/audio/intel-hda.c
index d7c2c3c2fd..cd4743a405 100644
--- a/hw/audio/intel-hda.c
+++ b/hw/audio/intel-hda.c
@@ -1313,7 +1313,7 @@ static void intel_hda_and_codec_init(const char *audiodev)
intel_hda = qdev_device_add_from_qdict(props, false, &error_fatal);
hdabus = QLIST_FIRST(&intel_hda->child_bus);
- codec = qdev_new("hda-duplex");
+ codec = qdev_new_orphan("hda-duplex");
qdev_prop_set_string(codec, "audiodev", audiodev);
qdev_realize_and_unref(codec, hdabus, &error_fatal);
object_unref(intel_hda);
diff --git a/hw/audio/model.c b/hw/audio/model.c
index 86a5419b09..bd8ca35153 100644
--- a/hw/audio/model.c
+++ b/hw/audio/model.c
@@ -110,7 +110,7 @@ void audio_model_init(void)
}
if (c->typename) {
- DeviceState *dev = qdev_new(c->typename);
+ DeviceState *dev = qdev_new_orphan(c->typename);
BusState *bus = qdev_find_default_bus(DEVICE_GET_CLASS(dev), &error_fatal);
qdev_prop_set_string(dev, "audiodev", audiodev_id);
qdev_realize_and_unref(dev, bus, &error_fatal);
diff --git a/hw/avr/atmega.c b/hw/avr/atmega.c
index 280f613af3..a85bdf929a 100644
--- a/hw/avr/atmega.c
+++ b/hw/avr/atmega.c
@@ -284,7 +284,7 @@ static void atmega_realize(DeviceState *dev, Error **errp)
* 0x20 - 0x5f: I/O memory
* 0x60 - 0xff: Extended I/O
*/
- s->io = qdev_new(TYPE_UNIMPLEMENTED_DEVICE);
+ s->io = qdev_new_orphan(TYPE_UNIMPLEMENTED_DEVICE);
qdev_prop_set_string(s->io, "name", "I/O");
qdev_prop_set_uint64(s->io, "size", mc->io_size);
sysbus_realize_and_unref(SYS_BUS_DEVICE(s->io), &error_fatal);
diff --git a/hw/block/fdc-sysbus.c b/hw/block/fdc-sysbus.c
index ab57dfd83e..4050750e65 100644
--- a/hw/block/fdc-sysbus.c
+++ b/hw/block/fdc-sysbus.c
@@ -102,7 +102,7 @@ void fdctrl_init_sysbus(qemu_irq irq, hwaddr mmio_base, DriveInfo **fds)
SysBusDevice *sbd;
FDCtrlSysBus *sys;
- dev = qdev_new("sysbus-fdc");
+ dev = qdev_new_orphan("sysbus-fdc");
sys = SYSBUS_FDC(dev);
sbd = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(sbd, &error_fatal);
@@ -118,7 +118,7 @@ void sun4m_fdctrl_init(qemu_irq irq, hwaddr io_base,
DeviceState *dev;
FDCtrlSysBus *sys;
- dev = qdev_new("sun-fdtwo");
+ dev = qdev_new_orphan("sun-fdtwo");
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sys = SYSBUS_FDC(dev);
sysbus_connect_irq(SYS_BUS_DEVICE(sys), 0, irq);
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index 2c1681b7d0..baac5f3c19 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -2329,7 +2329,7 @@ void fdctrl_init_drives(FloppyBus *bus, DriveInfo **fds)
for (i = 0; i < MAX_FD; i++) {
if (fds[i]) {
- dev = qdev_new("floppy");
+ dev = qdev_new_orphan("floppy");
qdev_prop_set_uint32(dev, "unit", i);
qdev_prop_set_enum(dev, "drive-type", FLOPPY_DRIVE_TYPE_AUTO);
qdev_prop_set_drive_err(dev, "drive", blk_by_legacy_dinfo(fds[i]),
diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
index 5b9ddb20b1..0466682ca8 100644
--- a/hw/block/pflash_cfi01.c
+++ b/hw/block/pflash_cfi01.c
@@ -958,7 +958,7 @@ PFlashCFI01 *pflash_cfi01_register(hwaddr base,
uint16_t id2, uint16_t id3,
int be)
{
- DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
if (blk) {
qdev_prop_set_drive(dev, "drive", blk);
diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c
index 6f952fe7de..a22bdc5830 100644
--- a/hw/block/pflash_cfi02.c
+++ b/hw/block/pflash_cfi02.c
@@ -1005,7 +1005,7 @@ PFlashCFI02 *pflash_cfi02_register(hwaddr base,
uint16_t unlock_addr1,
int be)
{
- DeviceState *dev = qdev_new(TYPE_PFLASH_CFI02);
+ DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI02);
if (blk) {
qdev_prop_set_drive(dev, "drive", blk);
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index 474c12fe4a..9dd69faa02 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -1074,7 +1074,7 @@ static void xen_block_device_create(XenBackendInstance *backend,
goto fail;
}
- xendev = XEN_DEVICE(qdev_new(type));
+ xendev = XEN_DEVICE(qdev_new_orphan(type));
blockdev = XEN_BLOCK_DEVICE(xendev);
if (!object_property_set_str(OBJECT(xendev), "vdev", vdev,
diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c
index 46fc4e31b8..6bc18851d9 100644
--- a/hw/char/exynos4210_uart.c
+++ b/hw/char/exynos4210_uart.c
@@ -659,7 +659,7 @@ DeviceState *exynos4210_uart_create(hwaddr addr,
DeviceState *dev;
SysBusDevice *bus;
- dev = qdev_new(TYPE_EXYNOS4210_UART);
+ dev = qdev_new_orphan(TYPE_EXYNOS4210_UART);
qdev_prop_set_chr(dev, "chardev", chr);
qdev_prop_set_uint32(dev, "channel", channel);
diff --git a/hw/char/mcf_uart.c b/hw/char/mcf_uart.c
index 24fd42da06..f4fc47364e 100644
--- a/hw/char/mcf_uart.c
+++ b/hw/char/mcf_uart.c
@@ -351,7 +351,7 @@ DeviceState *mcf_uart_create(qemu_irq irq, Chardev *chrdrv)
{
DeviceState *dev;
- dev = qdev_new(TYPE_MCF_UART);
+ dev = qdev_new_orphan(TYPE_MCF_UART);
if (chrdrv) {
qdev_prop_set_chr(dev, "chardev", chrdrv);
}
diff --git a/hw/char/mchp_pfsoc_mmuart.c b/hw/char/mchp_pfsoc_mmuart.c
index 6673721454..1a6d736f56 100644
--- a/hw/char/mchp_pfsoc_mmuart.c
+++ b/hw/char/mchp_pfsoc_mmuart.c
@@ -150,7 +150,7 @@ MchpPfSoCMMUartState *mchp_pfsoc_mmuart_create(MemoryRegion *sysmem,
hwaddr base,
qemu_irq irq, Chardev *chr)
{
- DeviceState *dev = qdev_new(TYPE_MCHP_PFSOC_UART);
+ DeviceState *dev = qdev_new_orphan(TYPE_MCHP_PFSOC_UART);
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", chr);
diff --git a/hw/char/pl011.c b/hw/char/pl011.c
index cb12c3e224..c8adf964ca 100644
--- a/hw/char/pl011.c
+++ b/hw/char/pl011.c
@@ -38,7 +38,7 @@ DeviceState *pl011_create(hwaddr addr, qemu_irq irq, Chardev *chr)
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new("pl011");
+ dev = qdev_new_orphan("pl011");
s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", chr);
sysbus_realize_and_unref(s, &error_fatal);
diff --git a/hw/char/serial-mm.c b/hw/char/serial-mm.c
index 0e0be26fa9..cd0844c450 100644
--- a/hw/char/serial-mm.c
+++ b/hw/char/serial-mm.c
@@ -99,7 +99,7 @@ SerialMM *serial_mm_init(MemoryRegion *address_space,
qemu_irq irq, int baudbase,
Chardev *chr, enum device_endian end)
{
- SerialMM *smm = SERIAL_MM(qdev_new(TYPE_SERIAL_MM));
+ SerialMM *smm = SERIAL_MM(qdev_new_orphan(TYPE_SERIAL_MM));
MemoryRegion *mr;
qdev_prop_set_uint8(DEVICE(smm), "regshift", regshift);
diff --git a/hw/char/sifive_uart.c b/hw/char/sifive_uart.c
index b9bbaaef59..1613a975e0 100644
--- a/hw/char/sifive_uart.c
+++ b/hw/char/sifive_uart.c
@@ -399,7 +399,7 @@ SiFiveUARTState *sifive_uart_create(MemoryRegion *address_space, hwaddr base,
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new("riscv.sifive.uart");
+ dev = qdev_new_orphan("riscv.sifive.uart");
s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", chr);
sysbus_realize_and_unref(s, &error_fatal);
diff --git a/hw/char/spapr_vty.c b/hw/char/spapr_vty.c
index 1dd9fb155c..a331d4be3b 100644
--- a/hw/char/spapr_vty.c
+++ b/hw/char/spapr_vty.c
@@ -158,7 +158,7 @@ void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev)
{
DeviceState *dev;
- dev = qdev_new("spapr-vty");
+ dev = qdev_new_orphan("spapr-vty");
qdev_prop_set_chr(dev, "chardev", chardev);
qdev_realize_and_unref(dev, &bus->bus, &error_fatal);
}
diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c
index bdeb76dc87..57520192b9 100644
--- a/hw/char/xen_console.c
+++ b/hw/char/xen_console.c
@@ -562,7 +562,7 @@ static void xen_console_device_create(XenBackendInstance *backend,
goto fail;
}
- xendev = XEN_DEVICE(qdev_new(TYPE_XEN_CONSOLE_DEVICE));
+ xendev = XEN_DEVICE(qdev_new_orphan(TYPE_XEN_CONSOLE_DEVICE));
con = XEN_CONSOLE_DEVICE(xendev);
con->dev = number;
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index e2aab3d1fc..8a8d206a02 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -145,12 +145,12 @@ bool qdev_set_parent_bus(DeviceState *dev, BusState *bus, Error **errp)
return true;
}
-DeviceState *qdev_new(const char *name)
+DeviceState *qdev_new_orphan(const char *name)
{
return DEVICE(object_new(name));
}
-DeviceState *qdev_try_new(const char *name)
+DeviceState *qdev_try_new_orphan(const char *name)
{
ObjectClass *oc = module_object_class_by_name(name);
if (!oc) {
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index 3e1160ee92..fe8baf73b5 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -218,7 +218,7 @@ DeviceState *sysbus_create_varargs(const char *name,
qemu_irq irq;
int n;
- dev = qdev_new(name);
+ dev = qdev_new_orphan(name);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
if (addr != (hwaddr)-1) {
diff --git a/hw/cxl/cxl-host.c b/hw/cxl/cxl-host.c
index 7e744312f1..c7a40a81f0 100644
--- a/hw/cxl/cxl-host.c
+++ b/hw/cxl/cxl-host.c
@@ -26,7 +26,7 @@ static void cxl_fixed_memory_window_config(CXLFixedMemoryWindowOptions *object,
int index, Error **errp)
{
ERRP_GUARD();
- DeviceState *dev = qdev_new(TYPE_CXL_FMW);
+ DeviceState *dev = qdev_new_orphan(TYPE_CXL_FMW);
CXLFixedWindow *fw = CXL_FMW(dev);
strList *target;
int i;
diff --git a/hw/display/sm501.c b/hw/display/sm501.c
index af87004837..d4b0ed048c 100644
--- a/hw/display/sm501.c
+++ b/hw/display/sm501.c
@@ -1910,7 +1910,7 @@ static void sm501_init(SM501State *s, DeviceState *dev,
/* i2c */
s->i2c_bus = i2c_init_bus(dev, "sm501.i2c");
/* ddc */
- I2CDDCState *ddc = I2CDDC(qdev_new(TYPE_I2CDDC));
+ I2CDDCState *ddc = I2CDDC(qdev_new_orphan(TYPE_I2CDDC));
i2c_slave_set_address(I2C_SLAVE(ddc), 0x50);
qdev_realize_and_unref(DEVICE(ddc), BUS(s->i2c_bus), &error_abort);
diff --git a/hw/display/xlnx_dp.c b/hw/display/xlnx_dp.c
index 98126ef320..e8490d644d 100644
--- a/hw/display/xlnx_dp.c
+++ b/hw/display/xlnx_dp.c
@@ -1346,11 +1346,11 @@ static void xlnx_dp_init(Object *obj)
* child properties of this device, we can drop the reference we
* hold to them, leaving the child-property as the only reference.
*/
- s->dpcd = DPCD(qdev_new("dpcd"));
+ s->dpcd = DPCD(qdev_new_orphan("dpcd"));
object_property_add_child(OBJECT(s), "dpcd", OBJECT(s->dpcd));
object_unref(s->dpcd);
- s->edid = I2CDDC(qdev_new("i2c-ddc"));
+ s->edid = I2CDDC(qdev_new_orphan("i2c-ddc"));
i2c_slave_set_address(I2C_SLAVE(s->edid), 0x50);
object_property_add_child(OBJECT(s), "edid", OBJECT(s->edid));
object_unref(s->edid);
diff --git a/hw/dma/rc4030.c b/hw/dma/rc4030.c
index 546ff67908..ab8aaf7da4 100644
--- a/hw/dma/rc4030.c
+++ b/hw/dma/rc4030.c
@@ -747,7 +747,7 @@ DeviceState *rc4030_init(rc4030_dma **dmas, IOMMUMemoryRegion **dma_mr)
{
DeviceState *dev;
- dev = qdev_new(TYPE_RC4030);
+ dev = qdev_new_orphan(TYPE_RC4030);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
*dmas = rc4030_allocate_dmas(dev, 4);
diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c
index aa49399322..712749cda8 100644
--- a/hw/hexagon/hexagon_dsp.c
+++ b/hw/hexagon/hexagon_dsp.c
@@ -131,14 +131,14 @@ static void hexagon_common_init(MachineState *machine, Rev_t rev,
machine->ram_size, &error_fatal);
memory_region_add_subregion(address_space, 0x0, &hms->ram);
- glob_regs_dev = qdev_new(TYPE_HEXAGON_GLOBALREG);
+ glob_regs_dev = qdev_new_orphan(TYPE_HEXAGON_GLOBALREG);
object_property_add_child(OBJECT(machine), "global-regs",
OBJECT(glob_regs_dev));
qdev_prop_set_uint64(glob_regs_dev, "config-table-addr", m_cfg->cfgbase);
qdev_prop_set_uint32(glob_regs_dev, "dsp-rev", rev);
sysbus_realize_and_unref(SYS_BUS_DEVICE(glob_regs_dev), &error_fatal);
- tlb_dev = qdev_new(TYPE_HEXAGON_TLB);
+ tlb_dev = qdev_new_orphan(TYPE_HEXAGON_TLB);
object_property_add_child(OBJECT(machine), "tlb", OBJECT(tlb_dev));
qdev_prop_set_uint32(tlb_dev, "num-entries",
m_cfg->cfgtable.jtlb_size_entries);
diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c
index a3638998b8..a7a6a8fbeb 100644
--- a/hw/hexagon/virt.c
+++ b/hw/hexagon/virt.c
@@ -129,7 +129,7 @@ static void fdt_add_uart(const HexagonVirtMachineState *vms, int uart,
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new(TYPE_PL011);
+ dev = qdev_new_orphan(TYPE_PL011);
s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
qdev_connect_clock_in(dev, "clk", vms->apb_clk);
@@ -268,13 +268,13 @@ static void virt_init(MachineState *ms)
&vms->parent_obj.cfgtable_rom);
fdt_add_hvx(vms, m_cfg);
- gsregs_dev = qdev_new(TYPE_HEXAGON_GLOBALREG);
+ gsregs_dev = qdev_new_orphan(TYPE_HEXAGON_GLOBALREG);
object_property_add_child(OBJECT(ms), "global-regs", OBJECT(gsregs_dev));
qdev_prop_set_uint64(gsregs_dev, "config-table-addr", m_cfg->cfgbase);
qdev_prop_set_uint32(gsregs_dev, "dsp-rev", v68_rev);
sysbus_realize_and_unref(SYS_BUS_DEVICE(gsregs_dev), &error_fatal);
- tlb_dev = qdev_new(TYPE_HEXAGON_TLB);
+ tlb_dev = qdev_new_orphan(TYPE_HEXAGON_TLB);
object_property_add_child(OBJECT(ms), "tlb", OBJECT(tlb_dev));
qdev_prop_set_uint32(tlb_dev, "num-entries",
m_cfg->cfgtable.jtlb_size_entries);
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index d762163ddf..02cafbda85 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -265,7 +265,7 @@ static LasiState *lasi_init(void)
{
DeviceState *dev;
- dev = qdev_new(TYPE_LASI_CHIP);
+ dev = qdev_new_orphan(TYPE_LASI_CHIP);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
return LASI_CHIP(dev);
@@ -275,7 +275,7 @@ static DinoState *dino_init(MemoryRegion *addr_space)
{
DeviceState *dev;
- dev = qdev_new(TYPE_DINO_PCI_HOST_BRIDGE);
+ dev = qdev_new_orphan(TYPE_DINO_PCI_HOST_BRIDGE);
object_property_set_link(OBJECT(dev), "memory-as", OBJECT(addr_space),
&error_fatal);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -411,7 +411,7 @@ static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
lasi_dev = hpm->lasi_dev;
if (lasi_dev && machine->enable_graphics &&
vga_interface_type != VGA_NONE) {
- dev = qdev_new("artist");
+ dev = qdev_new_orphan("artist");
s = SYS_BUS_DEVICE(dev);
bool disabled = object_property_get_bool(OBJECT(dev), "disable", NULL);
if (!disabled) {
@@ -614,7 +614,7 @@ static void machine_HP_715_init(MachineState *machine)
parallel_hds[0]);
/* PS/2 Keyboard/Mouse */
- dev = qdev_new(TYPE_LASIPS2);
+ dev = qdev_new_orphan(TYPE_LASIPS2);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
qdev_get_gpio_in(lasi_dev, LASI_IRQ_PS2KBD_HPA));
@@ -706,7 +706,7 @@ static void machine_HP_B160L_init(MachineState *machine)
parallel_hds[0]);
/* PS/2 Keyboard/Mouse */
- dev = qdev_new(TYPE_LASIPS2);
+ dev = qdev_new_orphan(TYPE_LASIPS2);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
qdev_get_gpio_in(lasi_dev, LASI_IRQ_PS2KBD_HPA));
@@ -733,7 +733,7 @@ static AstroState *astro_init(void)
{
DeviceState *dev;
- dev = qdev_new(TYPE_ASTRO_CHIP);
+ dev = qdev_new_orphan(TYPE_ASTRO_CHIP);
object_property_set_int(OBJECT(dev), "phys-addr-bits",
hppa_phys_addr_bits(&cpu[0]->env),
&error_abort);
diff --git a/hw/i2c/core.c b/hw/i2c/core.c
index 54f6bdca88..7803f6113c 100644
--- a/hw/i2c/core.c
+++ b/hw/i2c/core.c
@@ -368,7 +368,7 @@ I2CSlave *i2c_slave_new(const char *name, uint8_t addr)
{
DeviceState *dev;
- dev = qdev_new(name);
+ dev = qdev_new_orphan(name);
qdev_prop_set_uint8(dev, "address", addr);
return I2C_SLAVE(dev);
}
diff --git a/hw/i2c/smbus_eeprom.c b/hw/i2c/smbus_eeprom.c
index 693d476220..59fe07b16b 100644
--- a/hw/i2c/smbus_eeprom.c
+++ b/hw/i2c/smbus_eeprom.c
@@ -164,7 +164,7 @@ void smbus_eeprom_init_one(I2CBus *smbus, uint8_t address, uint8_t *eeprom_buf)
{
DeviceState *dev;
- dev = qdev_new(TYPE_SMBUS_EEPROM);
+ dev = qdev_new_orphan(TYPE_SMBUS_EEPROM);
qdev_prop_set_uint8(dev, "address", address);
/* FIXME: use an array of byte or block backend property? */
SMBUS_EEPROM(dev)->init_data = eeprom_buf;
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index e7adab7d2e..08d54c277f 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -108,7 +108,7 @@ static void create_gpex(MicrovmMachineState *mms)
DeviceState *dev;
int i;
- dev = qdev_new(TYPE_GPEX_HOST);
+ dev = qdev_new_orphan(TYPE_GPEX_HOST);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
/* Map only the first size_ecam bytes of ECAM space */
@@ -204,7 +204,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
/* Optional and legacy devices */
if (x86_machine_is_acpi_enabled(x86ms)) {
- DeviceState *dev = qdev_new(TYPE_ACPI_GED);
+ DeviceState *dev = qdev_new_orphan(TYPE_ACPI_GED);
qdev_prop_set_uint32(dev, "ged-event", ACPI_GED_PWR_DOWN_EVT);
sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, GED_MMIO_BASE);
@@ -216,7 +216,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
}
if (x86_machine_is_acpi_enabled(x86ms) && machine_usb(MACHINE(mms))) {
- DeviceState *dev = qdev_new(TYPE_XHCI_SYSBUS);
+ DeviceState *dev = qdev_new_orphan(TYPE_XHCI_SYSBUS);
qdev_prop_set_uint32(dev, "intrs", 1);
qdev_prop_set_uint32(dev, "slots", XHCI_MAXSLOTS);
qdev_prop_set_uint32(dev, "p2", 8);
diff --git a/hw/i386/nitro_enclave.c b/hw/i386/nitro_enclave.c
index 1ce9ee3358..fcad27bd9b 100644
--- a/hw/i386/nitro_enclave.c
+++ b/hw/i386/nitro_enclave.c
@@ -46,7 +46,7 @@ static BusState *find_free_virtio_mmio_bus(void)
static void vhost_user_vsock_init(NitroEnclaveMachineState *nems)
{
- DeviceState *dev = qdev_new(TYPE_VHOST_USER_VSOCK);
+ DeviceState *dev = qdev_new_orphan(TYPE_VHOST_USER_VSOCK);
VHostUserVSock *vsock = VHOST_USER_VSOCK(dev);
BusState *bus;
@@ -75,7 +75,7 @@ static void vhost_user_vsock_init(NitroEnclaveMachineState *nems)
static void virtio_nsm_init(NitroEnclaveMachineState *nems)
{
- DeviceState *dev = qdev_new(TYPE_VIRTIO_NSM);
+ DeviceState *dev = qdev_new_orphan(TYPE_VIRTIO_NSM);
VirtIONSM *vnsm = VIRTIO_NSM(dev);
BusState *bus = find_free_virtio_mmio_bus();
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index f064aa2b3e..bd5ab3d854 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1065,7 +1065,7 @@ void pc_basic_device_init(struct PCMachineState *pcms,
if (pcms->hpet_enabled) {
qemu_irq rtc_irq;
- hpet = qdev_try_new(TYPE_HPET);
+ hpet = qdev_try_new_orphan(TYPE_HPET);
if (!hpet) {
error_report("couldn't create HPET device");
exit(1);
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 82457bdb16..e580f9f2a6 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -193,7 +193,7 @@ static void pc_init1(MachineState *machine, const char *pci_type)
pci_memory = g_new(MemoryRegion, 1);
memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
- phb = OBJECT(qdev_new(TYPE_I440FX_PCI_HOST_BRIDGE));
+ phb = OBJECT(qdev_new_orphan(TYPE_I440FX_PCI_HOST_BRIDGE));
object_property_add_child(OBJECT(machine), "i440fx", phb);
object_property_set_link(phb, PCI_HOST_PROP_RAM_MEM,
OBJECT(ram_memory), &error_fatal);
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 6c1e4eff5f..0731403e55 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -199,7 +199,7 @@ static void pc_q35_init(MachineState *machine)
}
/* create pci host bus */
- phb = OBJECT(qdev_new(TYPE_Q35_HOST_DEVICE));
+ phb = OBJECT(qdev_new_orphan(TYPE_Q35_HOST_DEVICE));
pci_hole64_size = object_property_get_uint(phb,
PCI_HOST_PROP_PCI_HOLE64_SIZE,
diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
index 1a41a5972b..d351e3da77 100644
--- a/hw/i386/pc_sysfw.c
+++ b/hw/i386/pc_sysfw.c
@@ -79,7 +79,7 @@ static PFlashCFI01 *pc_pflash_create(PCMachineState *pcms,
const char *name,
const char *alias_prop_name)
{
- DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
qdev_prop_set_uint64(dev, "sector-length", FLASH_SECTOR_SIZE);
qdev_prop_set_uint8(dev, "width", 1);
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
index 7e4c509f5a..c326385456 100644
--- a/hw/i386/sgx.c
+++ b/hw/i386/sgx.c
@@ -311,7 +311,7 @@ void pc_machine_init_sgx_epc(PCMachineState *pcms)
&sgx_epc->mr);
for (list = x86ms->sgx_epc_list; list; list = list->next) {
- DeviceState *dev = qdev_new(TYPE_SGX_EPC);
+ DeviceState *dev = qdev_new_orphan(TYPE_SGX_EPC);
/* set the memdev link with memory backend */
object_property_parse(OBJECT(dev), SGX_EPC_MEMDEV_PROP,
diff --git a/hw/i386/x86-common.c b/hw/i386/x86-common.c
index 8f9419e7d3..b8e541e376 100644
--- a/hw/i386/x86-common.c
+++ b/hw/i386/x86-common.c
@@ -505,9 +505,9 @@ void ioapic_init_gsi(GSIState *gsi_state, Object *parent)
assert(parent);
if (kvm_ioapic_in_kernel()) {
- dev = qdev_new(TYPE_KVM_IOAPIC);
+ dev = qdev_new_orphan(TYPE_KVM_IOAPIC);
} else {
- dev = qdev_new(TYPE_IOAPIC);
+ dev = qdev_new_orphan(TYPE_IOAPIC);
}
object_property_add_child(parent, "ioapic", OBJECT(dev));
d = SYS_BUS_DEVICE(dev);
@@ -525,7 +525,7 @@ DeviceState *ioapic_init_secondary(GSIState *gsi_state)
SysBusDevice *d;
unsigned int i;
- dev = qdev_new(TYPE_IOAPIC);
+ dev = qdev_new_orphan(TYPE_IOAPIC);
d = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(d, &error_fatal);
sysbus_mmio_map(d, 0, IO_APIC_SECONDARY_ADDRESS);
diff --git a/hw/i3c/core.c b/hw/i3c/core.c
index 168526003d..2fb865490e 100644
--- a/hw/i3c/core.c
+++ b/hw/i3c/core.c
@@ -547,7 +547,7 @@ I3CTarget *i3c_target_new(const char *name, uint8_t addr, uint8_t dcr,
{
DeviceState *dev;
- dev = qdev_new(name);
+ dev = qdev_new_orphan(name);
qdev_prop_set_uint8(dev, "static-address", addr);
qdev_prop_set_uint8(dev, "dcr", dcr);
qdev_prop_set_uint8(dev, "bcr", bcr);
diff --git a/hw/ide/ide-bus.c b/hw/ide/ide-bus.c
index b24e4d17b4..40ba94235f 100644
--- a/hw/ide/ide-bus.c
+++ b/hw/ide/ide-bus.c
@@ -75,7 +75,7 @@ IDEDevice *ide_bus_create_drive(IDEBus *bus, int unit, DriveInfo *drive)
{
DeviceState *dev;
- dev = qdev_new(drive->media_cd ? "ide-cd" : "ide-hd");
+ dev = qdev_new_orphan(drive->media_cd ? "ide-cd" : "ide-hd");
qdev_prop_set_uint32(dev, "unit", unit);
qdev_prop_set_drive_err(dev, "drive", blk_by_legacy_dinfo(drive),
&error_fatal);
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
index d15e41174a..dd29a86035 100644
--- a/hw/intc/exynos4210_gic.c
+++ b/hw/intc/exynos4210_gic.c
@@ -60,7 +60,7 @@ static void exynos4210_gic_realize(DeviceState *dev, Error **errp)
uint32_t n = s->num_cpu;
uint32_t i;
- s->gic = qdev_new("arm_gic");
+ s->gic = qdev_new_orphan("arm_gic");
qdev_prop_set_uint32(s->gic, "num-cpu", s->num_cpu);
qdev_prop_set_uint32(s->gic, "num-irq", EXYNOS4210_GIC_NIRQ);
gicbusdev = SYS_BUS_DEVICE(s->gic);
diff --git a/hw/intc/riscv_aclint.c b/hw/intc/riscv_aclint.c
index e27e5fb394..92030d94b6 100644
--- a/hw/intc/riscv_aclint.c
+++ b/hw/intc/riscv_aclint.c
@@ -369,7 +369,7 @@ DeviceState *riscv_aclint_mtimer_create(hwaddr addr, hwaddr size,
bool provide_rdtime)
{
int i;
- DeviceState *dev = qdev_new(TYPE_RISCV_ACLINT_MTIMER);
+ DeviceState *dev = qdev_new_orphan(TYPE_RISCV_ACLINT_MTIMER);
RISCVAclintMTimerState *s = RISCV_ACLINT_MTIMER(dev);
assert(num_harts <= RISCV_ACLINT_MAX_HARTS);
@@ -552,7 +552,7 @@ DeviceState *riscv_aclint_swi_create(hwaddr addr, uint32_t hartid_base,
uint32_t num_harts, bool sswi)
{
int i;
- DeviceState *dev = qdev_new(TYPE_RISCV_ACLINT_SWI);
+ DeviceState *dev = qdev_new_orphan(TYPE_RISCV_ACLINT_SWI);
assert(num_harts <= RISCV_ACLINT_MAX_HARTS);
assert(!(addr & 0x3));
diff --git a/hw/intc/riscv_aplic.c b/hw/intc/riscv_aplic.c
index 84606e9f3d..977e259cb9 100644
--- a/hw/intc/riscv_aplic.c
+++ b/hw/intc/riscv_aplic.c
@@ -1113,7 +1113,7 @@ DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size,
uint32_t hartid_base, uint32_t num_harts, uint32_t num_sources,
uint32_t iprio_bits, bool msimode, bool mmode, DeviceState *parent)
{
- DeviceState *dev = qdev_new(TYPE_RISCV_APLIC);
+ DeviceState *dev = qdev_new_orphan(TYPE_RISCV_APLIC);
uint32_t i;
assert(num_harts < APLIC_MAX_IDC);
diff --git a/hw/intc/riscv_imsic.c b/hw/intc/riscv_imsic.c
index 7e5b5349ba..f05917ad5e 100644
--- a/hw/intc/riscv_imsic.c
+++ b/hw/intc/riscv_imsic.c
@@ -474,7 +474,7 @@ type_init(riscv_imsic_register_types)
DeviceState *riscv_imsic_create(hwaddr addr, uint32_t hartid, bool mmode,
uint32_t num_pages, uint32_t num_ids)
{
- DeviceState *dev = qdev_new(TYPE_RISCV_IMSIC);
+ DeviceState *dev = qdev_new_orphan(TYPE_RISCV_IMSIC);
CPUState *cpu = cpu_by_arch_id(hartid);
uint32_t i;
diff --git a/hw/intc/s390_flic.c b/hw/intc/s390_flic.c
index 57fd4b2b81..c86c0e1e60 100644
--- a/hw/intc/s390_flic.c
+++ b/hw/intc/s390_flic.c
@@ -62,11 +62,11 @@ void s390_flic_init(void)
DeviceState *dev;
if (kvm_enabled()) {
- dev = qdev_new(TYPE_KVM_S390_FLIC);
+ dev = qdev_new_orphan(TYPE_KVM_S390_FLIC);
object_property_add_child(qdev_get_machine(), TYPE_KVM_S390_FLIC,
OBJECT(dev));
} else {
- dev = qdev_new(TYPE_QEMU_S390_FLIC);
+ dev = qdev_new_orphan(TYPE_QEMU_S390_FLIC);
object_property_add_child(qdev_get_machine(), TYPE_QEMU_S390_FLIC,
OBJECT(dev));
}
diff --git a/hw/intc/sifive_plic.c b/hw/intc/sifive_plic.c
index 9c84ff06a9..00e6258403 100644
--- a/hw/intc/sifive_plic.c
+++ b/hw/intc/sifive_plic.c
@@ -481,7 +481,7 @@ DeviceState *sifive_plic_create(hwaddr addr, char *hart_config,
uint32_t enable_stride, uint32_t context_base,
uint32_t context_stride, uint32_t aperture_size)
{
- DeviceState *dev = qdev_new(TYPE_SIFIVE_PLIC);
+ DeviceState *dev = qdev_new_orphan(TYPE_SIFIVE_PLIC);
int i;
SiFivePLICState *plic;
diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c
index 7e6d2ce5a9..5e6340f635 100644
--- a/hw/isa/isa-bus.c
+++ b/hw/isa/isa-bus.c
@@ -59,7 +59,7 @@ ISABus *isa_bus_new(DeviceState *dev, MemoryRegion* address_space,
return NULL;
}
if (!dev) {
- bridge = qdev_new("isabus-bridge");
+ bridge = qdev_new_orphan("isabus-bridge");
dev = bridge;
}
@@ -155,12 +155,12 @@ int isa_register_portio_list(ISADevice *dev,
ISADevice *isa_new(const char *name)
{
- return ISA_DEVICE(qdev_new(name));
+ return ISA_DEVICE(qdev_new_orphan(name));
}
ISADevice *isa_try_new(const char *name)
{
- return ISA_DEVICE(qdev_try_new(name));
+ return ISA_DEVICE(qdev_try_new_orphan(name));
}
ISADevice *isa_create_simple(ISABus *bus, const char *name)
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 6693dea647..23751c46d7 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -150,7 +150,7 @@ static PFlashCFI01 *virt_flash_create1(LoongArchVirtMachineState *lvms,
const char *name,
const char *alias_prop_name)
{
- DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE);
qdev_prop_set_uint8(dev, "width", 4);
@@ -295,7 +295,7 @@ static DeviceState *create_acpi_ged(DeviceState *pch_pic,
event |= ACPI_GED_CPU_HOTPLUG_EVT;
}
- dev = qdev_new(TYPE_ACPI_GED);
+ dev = qdev_new_orphan(TYPE_ACPI_GED);
qdev_prop_set_uint32(dev, "ged-event", event);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -322,7 +322,7 @@ static DeviceState *create_platform_bus(DeviceState *pch_pic)
int i, irq;
MemoryRegion *sysmem = get_system_memory();
- dev = qdev_new(TYPE_PLATFORM_BUS_DEVICE);
+ dev = qdev_new_orphan(TYPE_PLATFORM_BUS_DEVICE);
dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE);
qdev_prop_set_uint32(dev, "num_irqs", VIRT_PLATFORM_BUS_NUM_IRQS);
qdev_prop_set_uint32(dev, "mmio_size", VIRT_PLATFORM_BUS_SIZE);
@@ -400,7 +400,7 @@ static void virt_devices_init(DeviceState *pch_pic,
hwaddr mmio_base, mmio_size;
int i, irq;
- gpex_dev = qdev_new(TYPE_GPEX_HOST);
+ gpex_dev = qdev_new_orphan(TYPE_GPEX_HOST);
d = SYS_BUS_DEVICE(gpex_dev);
sysbus_realize_and_unref(d, &error_fatal);
pci_bus = PCI_HOST_BRIDGE(gpex_dev)->bus;
@@ -601,20 +601,20 @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
*/
/* Create IPI device */
- ipi = qdev_new(TYPE_LOONGARCH_IPI);
+ ipi = qdev_new_orphan(TYPE_LOONGARCH_IPI);
lvms->ipi = ipi;
sysbus_realize_and_unref(SYS_BUS_DEVICE(ipi), &error_fatal);
/* Create DINTC device*/
if (virt_has_dmsi(lvms)) {
- dintc = qdev_new(TYPE_LOONGARCH_DINTC);
+ dintc = qdev_new_orphan(TYPE_LOONGARCH_DINTC);
lvms->dintc = dintc;
sysbus_realize_and_unref(SYS_BUS_DEVICE(dintc), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dintc), 0, VIRT_DINTC_BASE);
}
/* Create EXTIOI device */
- extioi = qdev_new(TYPE_LOONGARCH_EXTIOI);
+ extioi = qdev_new_orphan(TYPE_LOONGARCH_EXTIOI);
lvms->extioi = extioi;
if (virt_is_veiointc_enabled(lvms)) {
qdev_prop_set_bit(extioi, "has-virtualization-extension", true);
@@ -622,13 +622,13 @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
sysbus_realize_and_unref(SYS_BUS_DEVICE(extioi), &error_fatal);
virt_cpu_irq_init(lvms);
- pch_pic = qdev_new(TYPE_LOONGARCH_PIC);
+ pch_pic = qdev_new_orphan(TYPE_LOONGARCH_PIC);
num = VIRT_PCH_PIC_IRQ_NUM;
qdev_prop_set_uint32(pch_pic, "pch_pic_irq_num", num);
d = SYS_BUS_DEVICE(pch_pic);
sysbus_realize_and_unref(d, &error_fatal);
- pch_msi = qdev_new(TYPE_LOONGARCH_PCH_MSI);
+ pch_msi = qdev_new_orphan(TYPE_LOONGARCH_PCH_MSI);
start = num;
num = EXTIOI_IRQS - start;
qdev_prop_set_uint32(pch_msi, "msi_irq_base", start);
diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
index 1acd2fbdfb..f29c3b5226 100644
--- a/hw/m68k/an5206.c
+++ b/hw/m68k/an5206.c
@@ -25,7 +25,7 @@ static void mcf5206_init(M68kCPU *cpu, MemoryRegion *sysmem, uint32_t base)
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new(TYPE_MCF5206_MBAR);
+ dev = qdev_new_orphan(TYPE_MCF5206_MBAR);
object_property_set_link(OBJECT(dev), "m68k-cpu",
OBJECT(cpu), &error_abort);
s = SYS_BUS_DEVICE(dev);
diff --git a/hw/m68k/mcf_intc.c b/hw/m68k/mcf_intc.c
index e8d3bd937d..123bd7e385 100644
--- a/hw/m68k/mcf_intc.c
+++ b/hw/m68k/mcf_intc.c
@@ -211,7 +211,7 @@ DeviceState *mcf_intc_init(MemoryRegion *sysmem, hwaddr base, M68kCPU *cpu)
{
DeviceState *dev;
- dev = qdev_new(TYPE_MCF_INTC);
+ dev = qdev_new_orphan(TYPE_MCF_INTC);
object_property_set_link(OBJECT(dev), "m68k-cpu",
OBJECT(cpu), &error_abort);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c
index 9a0a57c0cc..5bb123594d 100644
--- a/hw/m68k/next-cube.c
+++ b/hw/m68k/next-cube.c
@@ -1272,7 +1272,7 @@ static void next_cube_init(MachineState *machine)
env->sr = 0x2700;
/* Peripheral Controller */
- pcdev = qdev_new(TYPE_NEXT_PC);
+ pcdev = qdev_new_orphan(TYPE_NEXT_PC);
object_property_set_link(OBJECT(pcdev), "cpu", OBJECT(cpu), &error_abort);
sysbus_realize_and_unref(SYS_BUS_DEVICE(pcdev), &error_fatal);
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index ab64250c47..688299ee2d 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -355,9 +355,9 @@ static void q800_machine_init(MachineState *machine)
"auxmode", 0));
adb_bus = qdev_get_child_bus(DEVICE(&m->via1), "adb.0");
- dev = qdev_new(TYPE_ADB_KEYBOARD);
+ dev = qdev_new_orphan(TYPE_ADB_KEYBOARD);
qdev_realize_and_unref(dev, adb_bus, &error_fatal);
- dev = qdev_new(TYPE_ADB_MOUSE);
+ dev = qdev_new_orphan(TYPE_ADB_MOUSE);
qdev_realize_and_unref(dev, adb_bus, &error_fatal);
/* VIA 2 */
diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c
index 51158ce1c0..f86d55d96c 100644
--- a/hw/m68k/virt.c
+++ b/hw/m68k/virt.c
@@ -155,7 +155,7 @@ static void virt_init(MachineState *machine)
/* IRQ Controller */
- irqc_dev = qdev_new(TYPE_M68K_IRQC);
+ irqc_dev = qdev_new_orphan(TYPE_M68K_IRQC);
object_property_set_link(OBJECT(irqc_dev), "m68k-cpu",
OBJECT(cpu), &error_abort);
sysbus_realize_and_unref(SYS_BUS_DEVICE(irqc_dev), &error_fatal);
@@ -169,7 +169,7 @@ static void virt_init(MachineState *machine)
*/
io_base = VIRT_GF_PIC_MMIO_BASE;
for (i = 0; i < VIRT_GF_PIC_NB; i++) {
- pic_dev[i] = qdev_new(TYPE_GOLDFISH_PIC);
+ pic_dev[i] = qdev_new_orphan(TYPE_GOLDFISH_PIC);
sysbus = SYS_BUS_DEVICE(pic_dev[i]);
qdev_prop_set_uint8(pic_dev[i], "index", i);
sysbus_realize_and_unref(sysbus, &error_fatal);
@@ -183,7 +183,7 @@ static void virt_init(MachineState *machine)
/* goldfish-rtc */
io_base = VIRT_GF_RTC_MMIO_BASE;
for (i = 0; i < VIRT_GF_RTC_NB; i++) {
- dev = qdev_new(TYPE_GOLDFISH_RTC);
+ dev = qdev_new_orphan(TYPE_GOLDFISH_RTC);
qdev_prop_set_bit(dev, "big-endian", true);
sysbus = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(sysbus, &error_fatal);
@@ -194,7 +194,7 @@ static void virt_init(MachineState *machine)
}
/* goldfish-tty */
- dev = qdev_new(TYPE_GOLDFISH_TTY);
+ dev = qdev_new_orphan(TYPE_GOLDFISH_TTY);
sysbus = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
sysbus_realize_and_unref(sysbus, &error_fatal);
@@ -208,7 +208,7 @@ static void virt_init(MachineState *machine)
/* virtio-mmio */
io_base = VIRT_VIRTIO_MMIO_BASE;
for (i = 0; i < 128; i++) {
- dev = qdev_new(TYPE_VIRTIO_MMIO);
+ dev = qdev_new_orphan(TYPE_VIRTIO_MMIO);
qdev_prop_set_bit(dev, "force-legacy", false);
sysbus = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(sysbus, &error_fatal);
diff --git a/hw/mem/sparse-mem.c b/hw/mem/sparse-mem.c
index 3b754de887..3310504578 100644
--- a/hw/mem/sparse-mem.c
+++ b/hw/mem/sparse-mem.c
@@ -108,7 +108,7 @@ MemoryRegion *sparse_mem_init(uint64_t addr, uint64_t length)
{
DeviceState *dev;
- dev = qdev_new(TYPE_SPARSE_MEM);
+ dev = qdev_new_orphan(TYPE_SPARSE_MEM);
qdev_prop_set_uint64(dev, "baseaddr", addr);
qdev_prop_set_uint64(dev, "length", length);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index 8f9f54ff1e..178cfd4a5e 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -110,7 +110,7 @@ petalogix_ml605_init(MachineState *machine)
64 * KiB, 2, 0x89, 0x18, 0x0000, 0x0, 0);
- dev = qdev_new("xlnx.xps-intc");
+ dev = qdev_new_orphan("xlnx.xps-intc");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_uint32(dev, "kind-of-intr", 1 << TIMER_IRQ);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -126,7 +126,7 @@ petalogix_ml605_init(MachineState *machine)
DEVICE_LITTLE_ENDIAN);
/* 2 timers at irq 2 @ 100 Mhz. */
- dev = qdev_new("xlnx.xps-timer");
+ dev = qdev_new_orphan("xlnx.xps-timer");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_uint32(dev, "one-timer-only", 0);
qdev_prop_set_uint32(dev, "clock-frequency", 100 * 1000000);
@@ -135,8 +135,8 @@ petalogix_ml605_init(MachineState *machine)
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[TIMER_IRQ]);
/* axi ethernet and dma initialization. */
- eth0 = qdev_new("xlnx.axi-ethernet");
- dma = qdev_new("xlnx.axi-dma");
+ eth0 = qdev_new_orphan("xlnx.axi-ethernet");
+ dma = qdev_new_orphan("xlnx.axi-dma");
/* FIXME: attach to the sysbus instead */
object_property_add_child(qdev_get_machine(), "xilinx-eth", OBJECT(eth0));
@@ -174,7 +174,7 @@ petalogix_ml605_init(MachineState *machine)
{
SSIBus *spi;
- dev = qdev_new("xlnx.xps-spi");
+ dev = qdev_new_orphan("xlnx.xps-spi");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_uint8(dev, "num-ss-bits", NUM_SPI_FLASHES);
busdev = SYS_BUS_DEVICE(dev);
@@ -188,7 +188,7 @@ petalogix_ml605_init(MachineState *machine)
dinfo = drive_get(IF_MTD, 0, i);
qemu_irq cs_line;
- dev = qdev_new("n25q128");
+ dev = qdev_new_orphan("n25q128");
if (dinfo) {
qdev_prop_set_drive_err(dev, "drive",
blk_by_legacy_dinfo(dinfo),
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index c5f6431900..91c1d64451 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -107,7 +107,7 @@ petalogix_s3adsp1800_init(MachineState *machine)
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
64 * KiB, 1, 0x89, 0x18, 0x0000, 0x0, 1);
- dev = qdev_new("xlnx.xps-intc");
+ dev = qdev_new_orphan("xlnx.xps-intc");
qdev_prop_set_enum(dev, "endianness", endianness);
qdev_prop_set_uint32(dev, "kind-of-intr",
1 << ETHLITE_IRQ | 1 << UARTLITE_IRQ);
@@ -119,7 +119,7 @@ petalogix_s3adsp1800_init(MachineState *machine)
irq[i] = qdev_get_gpio_in(dev, i);
}
- dev = qdev_new(TYPE_XILINX_UARTLITE);
+ dev = qdev_new_orphan(TYPE_XILINX_UARTLITE);
qdev_prop_set_enum(dev, "endianness", endianness);
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -127,7 +127,7 @@ petalogix_s3adsp1800_init(MachineState *machine)
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[UARTLITE_IRQ]);
/* 2 timers at irq 2 @ 62 Mhz. */
- dev = qdev_new("xlnx.xps-timer");
+ dev = qdev_new_orphan("xlnx.xps-timer");
qdev_prop_set_enum(dev, "endianness", endianness);
qdev_prop_set_uint32(dev, "one-timer-only", 0);
qdev_prop_set_uint32(dev, "clock-frequency", 62 * 1000000);
@@ -135,7 +135,7 @@ petalogix_s3adsp1800_init(MachineState *machine)
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, TIMER_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[TIMER_IRQ]);
- dev = qdev_new("xlnx.xps-ethernetlite");
+ dev = qdev_new_orphan("xlnx.xps-ethernetlite");
qdev_prop_set_enum(dev, "endianness", endianness);
qemu_configure_nic_device(dev, true, NULL);
qdev_prop_set_uint32(dev, "tx-ping-pong", 0);
diff --git a/hw/mips/boston.c b/hw/mips/boston.c
index 4579df23eb..e328c578a5 100644
--- a/hw/mips/boston.c
+++ b/hw/mips/boston.c
@@ -432,7 +432,7 @@ xilinx_pcie_init(MemoryRegion *sys_mem, uint32_t bus_nr,
DeviceState *dev;
MemoryRegion *cfg, *mmio;
- dev = qdev_new(TYPE_XILINX_PCIE_HOST);
+ dev = qdev_new_orphan(TYPE_XILINX_PCIE_HOST);
qdev_prop_set_uint32(dev, "bus_nr", bus_nr);
qdev_prop_set_uint64(dev, "cfg_base", cfg_base);
@@ -688,7 +688,7 @@ static void boston_mach_init(MachineState *machine)
exit(1);
}
- dev = qdev_new(TYPE_BOSTON);
+ dev = qdev_new_orphan(TYPE_BOSTON);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
s = BOSTON(dev);
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index bec534d38b..f9be67249f 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -127,7 +127,7 @@ static void mips_jazz_init_net(IOMMUMemoryRegion *rc4030_dma_mr,
return;
}
- dev = qdev_new("dp8393x");
+ dev = qdev_new_orphan("dp8393x");
qdev_set_nic_properties(dev, nd);
qdev_prop_set_uint8(dev, "it_shift", 2);
qdev_prop_set_bit(dev, "big_endian", TARGET_BIG_ENDIAN);
@@ -296,7 +296,7 @@ static void mips_jazz_init(MachineState *machine,
/* Video card */
switch (jazz_model) {
case JAZZ_MAGNUM:
- dev = qdev_new("sysbus-g364");
+ dev = qdev_new_orphan("sysbus-g364");
sysbus = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(sysbus, &error_fatal);
sysbus_mmio_map(sysbus, 0, 0x60080000);
@@ -313,7 +313,7 @@ static void mips_jazz_init(MachineState *machine,
}
break;
case JAZZ_PICA61:
- dev = qdev_new(TYPE_VGA_MMIO);
+ dev = qdev_new_orphan(TYPE_VGA_MMIO);
qdev_prop_set_uint8(dev, "it_shift", 0);
sysbus = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(sysbus, &error_fatal);
@@ -329,7 +329,7 @@ static void mips_jazz_init(MachineState *machine,
mips_jazz_init_net(rc4030_dma_mr, rc4030, dp8393x_prom);
/* SCSI adapter */
- dev = qdev_new(TYPE_SYSBUS_ESP);
+ dev = qdev_new_orphan(TYPE_SYSBUS_ESP);
sysbus_esp = SYSBUS_ESP(dev);
esp = &sysbus_esp->esp;
esp->dma_memory_read = rc4030_dma_read;
@@ -359,7 +359,7 @@ static void mips_jazz_init(MachineState *machine,
memory_region_add_subregion(address_space, 0x80004000, rtc);
/* Keyboard (i8042) */
- i8042 = I8042_MMIO(qdev_new(TYPE_I8042_MMIO));
+ i8042 = I8042_MMIO(qdev_new_orphan(TYPE_I8042_MMIO));
qdev_prop_set_uint64(DEVICE(i8042), "mask", 1);
qdev_prop_set_uint32(DEVICE(i8042), "size", 0x1000);
sysbus_realize_and_unref(SYS_BUS_DEVICE(i8042), &error_fatal);
@@ -389,7 +389,7 @@ static void mips_jazz_init(MachineState *machine,
/* FIXME: missing Jazz sound at 0x8000c000, rc4030[2] */
/* NVRAM */
- dev = qdev_new("ds1225y");
+ dev = qdev_new_orphan("ds1225y");
sysbus = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(sysbus, &error_fatal);
sysbus_mmio_map(sysbus, 0, 0x80009000);
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index 7de3fb09c1..d3b728339e 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -424,7 +424,7 @@ static inline void loongson3_virt_devices_init(MachineState *machine,
MachineClass *mc = MACHINE_GET_CLASS(machine);
LoongsonMachineState *s = LOONGSON_MACHINE(machine);
- dev = qdev_new(TYPE_GPEX_HOST);
+ dev = qdev_new_orphan(TYPE_GPEX_HOST);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
pci_bus = PCI_HOST_BRIDGE(dev)->bus;
@@ -519,7 +519,7 @@ static void mips_loongson3_virt_init(MachineState *machine)
memory_region_init(iocsr, OBJECT(machine), "loongson3.iocsr", UINT32_MAX);
- ipi = qdev_new(TYPE_LOONGSON_IPI);
+ ipi = qdev_new_orphan(TYPE_LOONGSON_IPI);
qdev_prop_set_uint32(ipi, "num-cpu", machine->smp.cpus);
sysbus_realize_and_unref(SYS_BUS_DEVICE(ipi), &error_fatal);
memory_region_add_subregion(iocsr, SMP_IPI_MAILBOX,
@@ -527,7 +527,7 @@ static void mips_loongson3_virt_init(MachineState *machine)
memory_region_add_subregion(iocsr, MAIL_SEND_ADDR,
sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi), 1));
- liointc = qdev_new("loongson.liointc");
+ liointc = qdev_new_orphan("loongson.liointc");
sysbus_realize_and_unref(SYS_BUS_DEVICE(liointc), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(liointc), 0, virt_memmap[VIRT_LIOINTC].base);
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index 38c71f66f2..fc5dbf262c 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -1098,7 +1098,7 @@ void mips_malta_init(MachineState *machine)
PCIDevice *piix4;
DeviceState *dev;
- s = MIPS_MALTA(qdev_new(TYPE_MIPS_MALTA));
+ s = MIPS_MALTA(qdev_new_orphan(TYPE_MIPS_MALTA));
sysbus_realize_and_unref(SYS_BUS_DEVICE(s), &error_fatal);
/* create CPU */
@@ -1226,7 +1226,7 @@ void mips_malta_init(MachineState *machine)
stl_p(memory_region_get_ram_ptr(bios_copy) + 0x10, 0x00000420);
/* Northbridge */
- dev = qdev_new("gt64120");
+ dev = qdev_new_orphan("gt64120");
qdev_prop_set_bit(dev, "cpu-little-endian", !TARGET_BIG_ENDIAN);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci"));
diff --git a/hw/misc/empty_slot.c b/hw/misc/empty_slot.c
index aab9373c09..182211fdcc 100644
--- a/hw/misc/empty_slot.c
+++ b/hw/misc/empty_slot.c
@@ -58,7 +58,7 @@ void empty_slot_init(const char *name, hwaddr addr, uint64_t slot_size)
/* Only empty slots larger than 0 byte need handling. */
DeviceState *dev;
- dev = qdev_new(TYPE_EMPTY_SLOT);
+ dev = qdev_new_orphan(TYPE_EMPTY_SLOT);
qdev_prop_set_uint64(dev, "size", slot_size);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/misc/led.c b/hw/misc/led.c
index 8b758c1b76..620284063b 100644
--- a/hw/misc/led.c
+++ b/hw/misc/led.c
@@ -141,7 +141,7 @@ LEDState *led_create_simple(Object *parentobj,
g_autofree char *name = NULL;
DeviceState *dev;
- dev = qdev_new(TYPE_LED);
+ dev = qdev_new_orphan(TYPE_LED);
qdev_prop_set_bit(dev, "gpio-active-high",
gpio_polarity == GPIO_POLARITY_ACTIVE_HIGH);
qdev_prop_set_string(dev, "color", led_color_name[color]);
diff --git a/hw/misc/sifive_e_prci.c b/hw/misc/sifive_e_prci.c
index a4a60e7b40..7ac5db5933 100644
--- a/hw/misc/sifive_e_prci.c
+++ b/hw/misc/sifive_e_prci.c
@@ -117,7 +117,7 @@ type_init(sifive_e_prci_register_types)
*/
DeviceState *sifive_e_prci_create(hwaddr addr)
{
- DeviceState *dev = qdev_new(TYPE_SIFIVE_E_PRCI);
+ DeviceState *dev = qdev_new_orphan(TYPE_SIFIVE_E_PRCI);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
return dev;
diff --git a/hw/misc/sifive_test.c b/hw/misc/sifive_test.c
index 41f102e2dc..f861858d9b 100644
--- a/hw/misc/sifive_test.c
+++ b/hw/misc/sifive_test.c
@@ -97,7 +97,7 @@ type_init(sifive_test_register_types)
*/
DeviceState *sifive_test_create(hwaddr addr)
{
- DeviceState *dev = qdev_new(TYPE_SIFIVE_TEST);
+ DeviceState *dev = qdev_new_orphan(TYPE_SIFIVE_TEST);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
return dev;
diff --git a/hw/net/lan9118.c b/hw/net/lan9118.c
index 072a741d81..87213c0d8d 100644
--- a/hw/net/lan9118.c
+++ b/hw/net/lan9118.c
@@ -1339,7 +1339,7 @@ void lan9118_init(uint32_t base, qemu_irq irq)
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new(TYPE_LAN9118);
+ dev = qdev_new_orphan(TYPE_LAN9118);
qemu_configure_nic_device(dev, true, NULL);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
diff --git a/hw/net/smc91c111.c b/hw/net/smc91c111.c
index 3b526524fb..6186d88717 100644
--- a/hw/net/smc91c111.c
+++ b/hw/net/smc91c111.c
@@ -954,7 +954,7 @@ void smc91c111_init(uint32_t base, qemu_irq irq)
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new(TYPE_SMC91C111);
+ dev = qdev_new_orphan(TYPE_SMC91C111);
qemu_configure_nic_device(dev, true, NULL);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c
index 550848307d..f10ea64798 100644
--- a/hw/net/spapr_llan.c
+++ b/hw/net/spapr_llan.c
@@ -371,7 +371,7 @@ void spapr_vlan_create(SpaprVioBus *bus, NICInfo *nd)
{
DeviceState *dev;
- dev = qdev_new("spapr-vlan");
+ dev = qdev_new_orphan("spapr-vlan");
qdev_set_nic_properties(dev, nd);
diff --git a/hw/net/xen_nic.c b/hw/net/xen_nic.c
index f4d0b06013..212281aac7 100644
--- a/hw/net/xen_nic.c
+++ b/hw/net/xen_nic.c
@@ -619,7 +619,7 @@ static void xen_net_device_create(XenBackendInstance *backend,
goto fail;
}
- xendev = XEN_DEVICE(qdev_new(TYPE_XEN_NET_DEVICE));
+ xendev = XEN_DEVICE(qdev_new_orphan(TYPE_XEN_NET_DEVICE));
net = XEN_NET_DEVICE(xendev);
net->dev = number;
diff --git a/hw/nitro/machine.c b/hw/nitro/machine.c
index 8849959359..efcc2c8a3f 100644
--- a/hw/nitro/machine.c
+++ b/hw/nitro/machine.c
@@ -197,7 +197,7 @@ static void nitro_machine_init(MachineState *machine)
NitroVsockBridge *bridge = nitro_vsock_bridge_create();
/* Nitro Enclaves require a heartbeat device. Provide one. */
- qdev_realize(qdev_new(TYPE_NITRO_HEARTBEAT),
+ qdev_realize(qdev_new_orphan(TYPE_NITRO_HEARTBEAT),
BUS(&bridge->bus), &error_fatal);
/*
@@ -209,7 +209,7 @@ static void nitro_machine_init(MachineState *machine)
Chardev *chr = serial_hd(0);
if (chr) {
- DeviceState *dev = qdev_new(TYPE_NITRO_SERIAL_VSOCK);
+ DeviceState *dev = qdev_new_orphan(TYPE_NITRO_SERIAL_VSOCK);
qdev_prop_set_chr(dev, "chardev", chr);
qdev_realize(dev, BUS(&bridge->bus), &error_fatal);
diff --git a/hw/nitro/nitro-vsock-bus.c b/hw/nitro/nitro-vsock-bus.c
index eed29df512..f7540eaa54 100644
--- a/hw/nitro/nitro-vsock-bus.c
+++ b/hw/nitro/nitro-vsock-bus.c
@@ -48,7 +48,7 @@ void nitro_vsock_bridge_start_enclave(NitroVsockBridge *bridge,
NitroVsockBridge *nitro_vsock_bridge_create(void)
{
- DeviceState *dev = qdev_new(TYPE_NITRO_VSOCK_BRIDGE);
+ DeviceState *dev = qdev_new_orphan(TYPE_NITRO_VSOCK_BRIDGE);
qdev_set_id(dev, g_strdup("nitro-vsock"), &error_fatal);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
index a67e159889..300a5aa835 100644
--- a/hw/nvme/ctrl.c
+++ b/hw/nvme/ctrl.c
@@ -9556,7 +9556,7 @@ static int nvme_init_subsys(NvmeCtrl *n, Error **errp)
int cntlid;
if (!n->subsys) {
- DeviceState *dev = qdev_new(TYPE_NVME_SUBSYS);
+ DeviceState *dev = qdev_new_orphan(TYPE_NVME_SUBSYS);
qdev_prop_set_string(dev, "nqn", n->params.serial);
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index b057d870c0..01fba1c6f6 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -1029,7 +1029,7 @@ FWCfgState *fw_cfg_init_io_dma(uint32_t iobase, AddressSpace *dma_as)
assert(dma_as);
- dev = qdev_new(TYPE_FW_CFG_IO);
+ dev = qdev_new_orphan(TYPE_FW_CFG_IO);
object_property_add_child(OBJECT(qdev_get_machine()), TYPE_FW_CFG,
OBJECT(dev));
@@ -1061,7 +1061,7 @@ static FWCfgState *fw_cfg_init_mem_internal(hwaddr ctl_addr,
FWCfgState *s;
bool dma_requested = dma_addr && dma_as;
- dev = qdev_new(TYPE_FW_CFG_MEM);
+ dev = qdev_new_orphan(TYPE_FW_CFG_MEM);
qdev_prop_set_uint32(dev, "data_width", data_width);
if (!dma_requested) {
qdev_prop_set_bit(dev, "dma_enabled", false);
diff --git a/hw/or1k/or1k-sim.c b/hw/or1k/or1k-sim.c
index b55105cd14..bd668d0e47 100644
--- a/hw/or1k/or1k-sim.c
+++ b/hw/or1k/or1k-sim.c
@@ -186,7 +186,7 @@ static void openrisc_sim_net_init(Or1ksimState *state, hwaddr base, hwaddr size,
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
if (num_cpus > 1) {
- DeviceState *splitter = qdev_new(TYPE_SPLIT_IRQ);
+ DeviceState *splitter = qdev_new_orphan(TYPE_SPLIT_IRQ);
qdev_prop_set_uint32(splitter, "num-lines", num_cpus);
qdev_realize_and_unref(splitter, NULL, &error_fatal);
for (i = 0; i < num_cpus; i++) {
@@ -221,7 +221,7 @@ static void openrisc_sim_ompic_init(Or1ksimState *state, hwaddr base,
char *nodename;
int i;
- dev = qdev_new("or1k-ompic");
+ dev = qdev_new_orphan("or1k-ompic");
qdev_prop_set_uint32(dev, "num-cpus", num_cpus);
s = SYS_BUS_DEVICE(dev);
@@ -254,7 +254,7 @@ static void openrisc_sim_serial_init(Or1ksimState *state, hwaddr base,
int i;
if (num_cpus > 1) {
- DeviceState *splitter = qdev_new(TYPE_SPLIT_IRQ);
+ DeviceState *splitter = qdev_new_orphan(TYPE_SPLIT_IRQ);
qdev_prop_set_uint32(splitter, "num-lines", num_cpus);
qdev_realize_and_unref(splitter, NULL, &error_fatal);
for (i = 0; i < num_cpus; i++) {
diff --git a/hw/or1k/virt.c b/hw/or1k/virt.c
index 2ff5c084a2..3067a5b2e7 100644
--- a/hw/or1k/virt.c
+++ b/hw/or1k/virt.c
@@ -110,7 +110,7 @@ static qemu_irq get_per_cpu_irq(OpenRISCCPU *cpus[], int num_cpus, int irq_pin)
int i;
if (num_cpus > 1) {
- DeviceState *splitter = qdev_new(TYPE_SPLIT_IRQ);
+ DeviceState *splitter = qdev_new_orphan(TYPE_SPLIT_IRQ);
qdev_prop_set_uint32(splitter, "num-lines", num_cpus);
qdev_realize_and_unref(splitter, NULL, &error_fatal);
for (i = 0; i < num_cpus; i++) {
@@ -206,7 +206,7 @@ static void openrisc_virt_ompic_init(OR1KVirtState *state, hwaddr base,
char *nodename;
int i;
- dev = qdev_new("or1k-ompic");
+ dev = qdev_new_orphan("or1k-ompic");
qdev_prop_set_uint32(dev, "num-cpus", num_cpus);
s = SYS_BUS_DEVICE(dev);
@@ -379,7 +379,7 @@ static void openrisc_virt_pcie_init(OR1KVirtState *state,
qemu_irq pcie_irq;
int i;
- dev = qdev_new(TYPE_GPEX_HOST);
+ dev = qdev_new_orphan(TYPE_GPEX_HOST);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
/* Map ECAM space. */
@@ -451,7 +451,7 @@ static void openrisc_virt_virtio_init(OR1KVirtState *state, hwaddr base,
qemu_irq virtio_irq = get_per_cpu_irq(cpus, num_cpus, irq_pin);
/* VirtIO MMIO devices */
- dev = qdev_new(TYPE_VIRTIO_MMIO);
+ dev = qdev_new_orphan(TYPE_VIRTIO_MMIO);
qdev_prop_set_bit(dev, "force-legacy", false);
sysbus = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(sysbus, &error_fatal);
diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
index 40ffbc4e08..11a28b5503 100644
--- a/hw/pci-bridge/pci_expander_bridge.c
+++ b/hw/pci-bridge/pci_expander_bridge.c
@@ -359,7 +359,7 @@ static bool pxb_dev_realize_common(PCIDevice *dev, enum BusType type,
dev_name = dev->qdev.id;
}
- ds = qdev_new(type == CXL ? TYPE_PXB_CXL_HOST : TYPE_PXB_HOST);
+ ds = qdev_new_orphan(type == CXL ? TYPE_PXB_CXL_HOST : TYPE_PXB_HOST);
if (type == PCIE) {
bus = pci_root_bus_new(ds, dev_name, NULL, NULL, 0, TYPE_PXB_PCIE_BUS);
} else if (type == CXL) {
@@ -368,7 +368,7 @@ static bool pxb_dev_realize_common(PCIDevice *dev, enum BusType type,
PXB_CXL_DEV(dev)->cxl_host_bridge = PXB_CXL_HOST(ds);
} else {
bus = pci_root_bus_new(ds, "pxb-internal", NULL, NULL, 0, TYPE_PXB_BUS);
- bds = qdev_new("pci-bridge");
+ bds = qdev_new_orphan("pci-bridge");
bds->id = g_strdup(dev_name);
qdev_prop_set_uint8(bds, PCI_BRIDGE_DEV_PROP_CHASSIS_NR, pxb->bus_nr);
qdev_prop_set_bit(bds, PCI_BRIDGE_DEV_PROP_SHPC, false);
diff --git a/hw/pci-host/astro.c b/hw/pci-host/astro.c
index fc07608da7..1de3960713 100644
--- a/hw/pci-host/astro.c
+++ b/hw/pci-host/astro.c
@@ -521,7 +521,7 @@ static ElroyState *elroy_init(int num)
{
DeviceState *dev;
- dev = qdev_new(TYPE_ELROY_PCI_HOST_BRIDGE);
+ dev = qdev_new_orphan(TYPE_ELROY_PCI_HOST_BRIDGE);
dev->id = g_strdup_printf("elroy%d", num);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c
index ff2f5c966e..cd7272c90c 100644
--- a/hw/pci-host/bonito.c
+++ b/hw/pci-host/bonito.c
@@ -741,7 +741,7 @@ PCIBus *bonito_init(qemu_irq *pic)
PCIBonitoState *s;
PCIDevice *d;
- dev = qdev_new(TYPE_BONITO_PCI_HOST_BRIDGE);
+ dev = qdev_new_orphan(TYPE_BONITO_PCI_HOST_BRIDGE);
phb = PCI_HOST_BRIDGE(dev);
pcihost = BONITO_PCI_HOST_BRIDGE(dev);
pcihost->pic = pic;
diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c
index ee5cdc3e45..54dac5e989 100644
--- a/hw/pci-host/pnv_phb4_pec.c
+++ b/hw/pci-host/pnv_phb4_pec.c
@@ -180,7 +180,7 @@ static PnvPHB *pnv_pec_default_phb_realize(PnvPhb4PecState *pec,
int stack_no,
Error **errp)
{
- PnvPHB *phb = PNV_PHB(qdev_new(TYPE_PNV_PHB));
+ PnvPHB *phb = PNV_PHB(qdev_new_orphan(TYPE_PNV_PHB));
int phb_id = pnv_phb4_pec_get_phb_id(pec, stack_no);
object_property_add_child(OBJECT(pec), "phb[*]", OBJECT(phb));
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index d3191609e2..d14fc6478e 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -2393,7 +2393,7 @@ static PCIDevice *pci_new_internal(int devfn, bool multifunction,
{
DeviceState *dev;
- dev = qdev_new(name);
+ dev = qdev_new_orphan(name);
qdev_prop_set_int32(dev, "addr", devfn);
qdev_prop_set_bit(dev, "multifunction", multifunction);
return PCI_DEVICE(dev);
diff --git a/hw/ppc/amigaone.c b/hw/ppc/amigaone.c
index 2e94e80b56..bcdf36b344 100644
--- a/hw/ppc/amigaone.c
+++ b/hw/ppc/amigaone.c
@@ -302,7 +302,7 @@ static void amigaone_init(MachineState *machine)
}
/* nvram */
- dev = qdev_new(TYPE_A1_NVRAM);
+ dev = qdev_new_orphan(TYPE_A1_NVRAM);
di = drive_get(IF_MTD, 0, 0);
if (di) {
qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(di));
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 1876882a04..65e71826a4 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -815,7 +815,7 @@ static DeviceState *ppce500_init_mpic_qemu(PPCE500MachineState *pms,
unsigned int smp_cpus = machine->smp.cpus;
const PPCE500MachineClass *pmc = PPCE500_MACHINE_GET_CLASS(pms);
- dev = qdev_new(TYPE_OPENPIC);
+ dev = qdev_new_orphan(TYPE_OPENPIC);
object_property_add_child(OBJECT(machine), "pic", OBJECT(dev));
qdev_prop_set_uint32(dev, "model", pmc->mpic_version);
qdev_prop_set_uint32(dev, "nb_cpus", smp_cpus);
@@ -840,7 +840,7 @@ static DeviceState *ppce500_init_mpic_kvm(const PPCE500MachineClass *pmc,
DeviceState *dev;
CPUState *cs;
- dev = qdev_new(TYPE_KVM_OPENPIC);
+ dev = qdev_new_orphan(TYPE_KVM_OPENPIC);
qdev_prop_set_uint32(dev, "model", pmc->mpic_version);
if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp)) {
@@ -993,7 +993,7 @@ void ppce500_init(MachineState *machine)
/* Register Memory */
memory_region_add_subregion(address_space_mem, 0, machine->ram);
- dev = qdev_new("e500-ccsr");
+ dev = qdev_new_orphan("e500-ccsr");
s = SYS_BUS_DEVICE(dev);
object_property_add_child(OBJECT(machine), "e500-ccsr", OBJECT(dev));
sysbus_realize_and_unref(s, &error_fatal);
@@ -1018,7 +1018,7 @@ void ppce500_init(MachineState *machine)
}
/* I2C */
- dev = qdev_new("mpc-i2c");
+ dev = qdev_new_orphan("mpc-i2c");
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(mpicdev, MPC8544_I2C_IRQ));
@@ -1029,7 +1029,7 @@ void ppce500_init(MachineState *machine)
/* eSDHC */
if (pmc->has_esdhc) {
- dev = qdev_new(TYPE_UNIMPLEMENTED_DEVICE);
+ dev = qdev_new_orphan(TYPE_UNIMPLEMENTED_DEVICE);
qdev_prop_set_string(dev, "name", "esdhc");
qdev_prop_set_uint64(dev, "size", MPC85XX_ESDHC_REGS_SIZE);
s = SYS_BUS_DEVICE(dev);
@@ -1037,7 +1037,7 @@ void ppce500_init(MachineState *machine)
memory_region_add_subregion(ccsr_addr_space, MPC85XX_ESDHC_REGS_OFFSET,
sysbus_mmio_get_region(s, 0));
- dev = qdev_new(TYPE_FSL_ESDHC_BE);
+ dev = qdev_new_orphan(TYPE_FSL_ESDHC_BE);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(mpicdev, MPC85XX_ESDHC_IRQ));
@@ -1046,14 +1046,14 @@ void ppce500_init(MachineState *machine)
}
/* General Utility device */
- dev = qdev_new("mpc8544-guts");
+ dev = qdev_new_orphan("mpc8544-guts");
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
memory_region_add_subregion(ccsr_addr_space, MPC8544_UTIL_OFFSET,
sysbus_mmio_get_region(s, 0));
/* PCI */
- dev = qdev_new("e500-pcihost");
+ dev = qdev_new_orphan("e500-pcihost");
object_property_add_child(OBJECT(machine), "pci-host", OBJECT(dev));
qdev_prop_set_uint32(dev, "first_slot", pmc->pci_first_slot);
qdev_prop_set_uint32(dev, "first_pin_irq", pci_irq_nrs[0]);
@@ -1081,7 +1081,7 @@ void ppce500_init(MachineState *machine)
if (pmc->has_mpc8xxx_gpio) {
qemu_irq poweroff_irq;
- dev = qdev_new("mpc8xxx_gpio");
+ dev = qdev_new_orphan("mpc8xxx_gpio");
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(mpicdev, MPC8XXX_GPIO_IRQ));
@@ -1094,7 +1094,7 @@ void ppce500_init(MachineState *machine)
}
/* Platform Bus Device */
- dev = qdev_new(TYPE_PLATFORM_BUS_DEVICE);
+ dev = qdev_new_orphan(TYPE_PLATFORM_BUS_DEVICE);
dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE);
qdev_prop_set_uint32(dev, "num_irqs", pmc->platform_bus_num_irqs);
qdev_prop_set_uint32(dev, "mmio_size", pmc->platform_bus_size);
@@ -1136,7 +1136,7 @@ void ppce500_init(MachineState *machine)
exit(1);
}
- dev = qdev_new(TYPE_PFLASH_CFI01);
+ dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
qdev_prop_set_drive(dev, "drive", blk);
qdev_prop_set_uint32(dev, "num-blocks", size / sector_len);
qdev_prop_set_uint64(dev, "sector-length", sector_len);
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index 3680d96ed3..31dda69127 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -286,7 +286,7 @@ static void ppc_core99_init(MachineState *machine)
}
/* UniN init */
- s = SYS_BUS_DEVICE(qdev_new(TYPE_UNI_NORTH));
+ s = SYS_BUS_DEVICE(qdev_new_orphan(TYPE_UNI_NORTH));
sysbus_realize_and_unref(s, &error_fatal);
memory_region_add_subregion(get_system_memory(), 0xf8000000,
sysbus_mmio_get_region(s, 0));
@@ -295,7 +295,7 @@ static void ppc_core99_init(MachineState *machine)
machine_arch = ARCH_MAC99_U3;
/* 970 gets a U3 bus */
/* Uninorth AGP bus */
- uninorth_pci_dev = qdev_new(TYPE_U3_AGP_HOST_BRIDGE);
+ uninorth_pci_dev = qdev_new_orphan(TYPE_U3_AGP_HOST_BRIDGE);
s = SYS_BUS_DEVICE(uninorth_pci_dev);
sysbus_realize_and_unref(s, &error_fatal);
sysbus_mmio_map(s, 0, 0xf0800000);
@@ -310,14 +310,14 @@ static void ppc_core99_init(MachineState *machine)
machine_arch = ARCH_MAC99;
/* Use values found on a real PowerMac */
/* Uninorth AGP bus */
- uninorth_agp_dev = qdev_new(TYPE_UNI_NORTH_AGP_HOST_BRIDGE);
+ uninorth_agp_dev = qdev_new_orphan(TYPE_UNI_NORTH_AGP_HOST_BRIDGE);
s = SYS_BUS_DEVICE(uninorth_agp_dev);
sysbus_realize_and_unref(s, &error_fatal);
sysbus_mmio_map(s, 0, 0xf0800000);
sysbus_mmio_map(s, 1, 0xf0c00000);
/* Uninorth internal bus */
- uninorth_internal_dev = qdev_new(
+ uninorth_internal_dev = qdev_new_orphan(
TYPE_UNI_NORTH_INTERNAL_PCI_HOST_BRIDGE);
s = SYS_BUS_DEVICE(uninorth_internal_dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -325,7 +325,7 @@ static void ppc_core99_init(MachineState *machine)
sysbus_mmio_map(s, 1, 0xf4c00000);
/* Uninorth main bus - this must be last to make it the default */
- uninorth_pci_dev = qdev_new(TYPE_UNI_NORTH_PCI_HOST_BRIDGE);
+ uninorth_pci_dev = qdev_new_orphan(TYPE_UNI_NORTH_PCI_HOST_BRIDGE);
qdev_prop_set_uint32(uninorth_pci_dev, "ofw-addr", 0xf2000000);
s = SYS_BUS_DEVICE(uninorth_pci_dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -408,10 +408,10 @@ static void ppc_core99_init(MachineState *machine)
}
adb_bus = qdev_get_child_bus(dev, "adb.0");
- dev = qdev_new(TYPE_ADB_KEYBOARD);
+ dev = qdev_new_orphan(TYPE_ADB_KEYBOARD);
qdev_realize_and_unref(dev, adb_bus, &error_fatal);
- dev = qdev_new(TYPE_ADB_MOUSE);
+ dev = qdev_new_orphan(TYPE_ADB_MOUSE);
qdev_realize_and_unref(dev, adb_bus, &error_fatal);
}
@@ -453,7 +453,7 @@ static void ppc_core99_init(MachineState *machine)
move the NVRAM out of ROM again for KVM */
nvram_addr = 0xFFE00000;
}
- dev = qdev_new(TYPE_MACIO_NVRAM);
+ dev = qdev_new_orphan(TYPE_MACIO_NVRAM);
qdev_prop_set_uint32(dev, "size", MACIO_NVRAM_SIZE);
qdev_prop_set_uint32(dev, "it_shift", 1);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -462,7 +462,7 @@ static void ppc_core99_init(MachineState *machine)
pmac_format_nvram_partition(nvr, MACIO_NVRAM_SIZE);
/* No PCI init: the BIOS will do it */
- dev = qdev_new(TYPE_FW_CFG_MEM);
+ dev = qdev_new_orphan(TYPE_FW_CFG_MEM);
fw_cfg = FW_CFG(dev);
qdev_prop_set_uint32(dev, "data_width", 1);
qdev_prop_set_bit(dev, "dma_enabled", false);
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index 24d9f2e3d5..aa366ca190 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -212,7 +212,7 @@ static void ppc_heathrow_init(MachineState *machine)
}
/* Grackle PCI host bridge */
- grackle_dev = qdev_new(TYPE_GRACKLE_PCI_HOST_BRIDGE);
+ grackle_dev = qdev_new_orphan(TYPE_GRACKLE_PCI_HOST_BRIDGE);
qdev_prop_set_uint32(grackle_dev, "ofw-addr", 0x80000000);
s = SYS_BUS_DEVICE(grackle_dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -279,9 +279,9 @@ static void ppc_heathrow_init(MachineState *machine)
/* MacIO CUDA/ADB */
dev = DEVICE(object_resolve_path_component(macio, "cuda"));
adb_bus = qdev_get_child_bus(dev, "adb.0");
- dev = qdev_new(TYPE_ADB_KEYBOARD);
+ dev = qdev_new_orphan(TYPE_ADB_KEYBOARD);
qdev_realize_and_unref(dev, adb_bus, &error_fatal);
- dev = qdev_new(TYPE_ADB_MOUSE);
+ dev = qdev_new_orphan(TYPE_ADB_MOUSE);
qdev_realize_and_unref(dev, adb_bus, &error_fatal);
if (machine_usb(machine)) {
@@ -303,7 +303,7 @@ static void ppc_heathrow_init(MachineState *machine)
/* No PCI init: the BIOS will do it */
- dev = qdev_new(TYPE_FW_CFG_MEM);
+ dev = qdev_new_orphan(TYPE_FW_CFG_MEM);
fw_cfg = FW_CFG(dev);
qdev_prop_set_uint32(dev, "data_width", 1);
qdev_prop_set_bit(dev, "dma_enabled", false);
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index c0cb45dbfb..b85b6dd46c 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1127,7 +1127,7 @@ static void pnv_init(MachineState *machine)
/*
* Create our simple PNOR device
*/
- dev = qdev_new(TYPE_PNV_PNOR);
+ dev = qdev_new_orphan(TYPE_PNV_PNOR);
pnor = drive_get(IF_MTD, 0, 0);
if (!pnor && defaults_enabled()) {
fw_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, PNOR_FILE_NAME);
@@ -1269,7 +1269,7 @@ static void pnv_init(MachineState *machine)
pnv->chips = g_new0(PnvChip *, pnv->num_chips);
for (i = 0; i < pnv->num_chips; i++) {
char chip_name[32];
- Object *chip = OBJECT(qdev_new(chip_typename));
+ Object *chip = OBJECT(qdev_new_orphan(chip_typename));
uint64_t chip_ram_size = pnv_chip_get_ram_size(pnv, i);
pnv->chips[i] = PNV_CHIP(chip);
diff --git a/hw/ppc/pnv_bmc.c b/hw/ppc/pnv_bmc.c
index fb70a8c1f2..6f65984f2e 100644
--- a/hw/ppc/pnv_bmc.c
+++ b/hw/ppc/pnv_bmc.c
@@ -299,7 +299,7 @@ IPMIBmc *pnv_bmc_create(PnvPnor *pnor)
{
DeviceState *dev;
- dev = qdev_new(TYPE_IPMI_BMC_SIMULATOR);
+ dev = qdev_new_orphan(TYPE_IPMI_BMC_SIMULATOR);
qdev_realize(dev, NULL, &error_fatal);
pnv_bmc_set_pnor(IPMI_BMC(dev), pnor);
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 2dde008b0e..e76d359e43 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -162,7 +162,7 @@ static void bamboo_init(MachineState *machine)
ppc_dcr_init(env, NULL, NULL);
/* interrupt controller */
- uicdev = qdev_new(TYPE_PPC_UIC);
+ uicdev = qdev_new_orphan(TYPE_PPC_UIC);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(uicdev), cpu, &error_fatal);
object_unref(OBJECT(uicdev));
uicsbd = SYS_BUS_DEVICE(uicdev);
@@ -172,7 +172,7 @@ static void bamboo_init(MachineState *machine)
qdev_get_gpio_in(DEVICE(cpu), PPC40x_INPUT_CINT));
/* SDRAM controller */
- dev = qdev_new(TYPE_PPC4xx_SDRAM_DDR);
+ dev = qdev_new_orphan(TYPE_PPC4xx_SDRAM_DDR);
object_property_set_link(OBJECT(dev), "dram", OBJECT(machine->ram),
&error_abort);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(dev), cpu, &error_fatal);
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 2672eb9e7a..f53ff9c582 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -289,7 +289,7 @@ static void ibm_40p_init(MachineState *machine)
g_free(filename);
/* PCI host */
- dev = qdev_new("raven-pcihost");
+ dev = qdev_new_orphan("raven-pcihost");
pcihost = SYS_BUS_DEVICE(dev);
object_property_add_child(qdev_get_machine(), "raven", OBJECT(dev));
sysbus_realize_and_unref(pcihost, &error_fatal);
@@ -363,7 +363,7 @@ static void ibm_40p_init(MachineState *machine)
}
/* Prepare firmware configuration for OpenBIOS */
- dev = qdev_new(TYPE_FW_CFG_MEM);
+ dev = qdev_new_orphan(TYPE_FW_CFG_MEM);
fw_cfg = FW_CFG(dev);
qdev_prop_set_uint32(dev, "data_width", 1);
qdev_prop_set_bit(dev, "dma_enabled", false);
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index b13dd224ba..778b04c532 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -275,7 +275,7 @@ static void sam460ex_init(MachineState *machine)
ppc_dcr_init(env, NULL, NULL);
/* PLB arbitrer */
- dev = qdev_new(TYPE_PPC4xx_PLB);
+ dev = qdev_new_orphan(TYPE_PPC4xx_PLB);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(dev), cpu, &error_fatal);
object_unref(OBJECT(dev));
@@ -291,7 +291,7 @@ static void sam460ex_init(MachineState *machine)
*/
const int input_ints[] = { -1, 30, 10, 16 };
- uic[i] = qdev_new(TYPE_PPC_UIC);
+ uic[i] = qdev_new_orphan(TYPE_PPC_UIC);
qdev_prop_set_uint32(uic[i], "dcr-base", 0xc0 + i * 0x10);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(uic[i]), cpu, &error_fatal);
object_unref(OBJECT(uic[i]));
@@ -321,7 +321,7 @@ static void sam460ex_init(MachineState *machine)
error_report("Memory below 64 MiB is not supported");
exit(1);
}
- dev = qdev_new(TYPE_PPC4xx_SDRAM_DDR2);
+ dev = qdev_new_orphan(TYPE_PPC4xx_SDRAM_DDR2);
object_property_set_link(OBJECT(dev), "dram", OBJECT(machine->ram),
&error_abort);
/*
@@ -351,7 +351,7 @@ static void sam460ex_init(MachineState *machine)
qdev_get_gpio_in(uic[0], 3));
/* External bus controller */
- dev = qdev_new(TYPE_PPC4xx_EBC);
+ dev = qdev_new_orphan(TYPE_PPC4xx_EBC);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(dev), cpu, &error_fatal);
object_unref(OBJECT(dev));
@@ -365,7 +365,7 @@ static void sam460ex_init(MachineState *machine)
ppc4xx_sdr_init(env);
/* MAL */
- dev = qdev_new(TYPE_PPC4xx_MAL);
+ dev = qdev_new_orphan(TYPE_PPC4xx_MAL);
qdev_prop_set_uint8(dev, "txc-num", 4);
qdev_prop_set_uint8(dev, "rxc-num", 16);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(dev), cpu, &error_fatal);
@@ -389,7 +389,7 @@ static void sam460ex_init(MachineState *machine)
/* USB */
sysbus_create_simple(TYPE_PPC4xx_EHCI, 0x4bffd0400,
qdev_get_gpio_in(uic[2], 29));
- dev = qdev_new("sysbus-ohci");
+ dev = qdev_new_orphan("sysbus-ohci");
qdev_prop_set_string(dev, "masterbus", "usb-bus.0");
qdev_prop_set_uint32(dev, "num-ports", 6);
sbdev = SYS_BUS_DEVICE(dev);
@@ -402,13 +402,13 @@ static void sam460ex_init(MachineState *machine)
usb_create_simple(usb_bus, "usb-mouse");
/* PCIe buses */
- dev = qdev_new(TYPE_PPC460EX_PCIE_HOST);
+ dev = qdev_new_orphan(TYPE_PPC460EX_PCIE_HOST);
qdev_prop_set_int32(dev, "busnum", 0);
qdev_prop_set_int32(dev, "dcrn-base", PCIE0_DCRN_BASE);
object_property_set_link(OBJECT(dev), "cpu", OBJECT(cpu), &error_abort);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
- dev = qdev_new(TYPE_PPC460EX_PCIE_HOST);
+ dev = qdev_new_orphan(TYPE_PPC460EX_PCIE_HOST);
qdev_prop_set_int32(dev, "busnum", 1);
qdev_prop_set_int32(dev, "dcrn-base", PCIE1_DCRN_BASE);
object_property_set_link(OBJECT(dev), "cpu", OBJECT(cpu), &error_abort);
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index b79828b4e9..30bf0cd0c0 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1885,7 +1885,7 @@ static void spapr_machine_reset(MachineState *machine, ResetType type)
static void spapr_create_nvram(SpaprMachineState *spapr)
{
- DeviceState *dev = qdev_new("spapr-nvram");
+ DeviceState *dev = qdev_new_orphan("spapr-nvram");
DriveInfo *dinfo = drive_get(IF_PFLASH, 0, 0);
if (dinfo) {
@@ -2799,7 +2799,7 @@ static PCIHostState *spapr_create_default_phb(void)
{
DeviceState *dev;
- dev = qdev_new(TYPE_SPAPR_PCI_HOST_BRIDGE);
+ dev = qdev_new_orphan(TYPE_SPAPR_PCI_HOST_BRIDGE);
qdev_prop_set_uint32(dev, "index", 0);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
index 3a9c96d939..76ae80d16e 100644
--- a/hw/ppc/spapr_irq.c
+++ b/hw/ppc/spapr_irq.c
@@ -312,7 +312,7 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
DeviceState *dev;
int i;
- dev = qdev_new(TYPE_SPAPR_XIVE);
+ dev = qdev_new_orphan(TYPE_SPAPR_XIVE);
qdev_prop_set_uint32(dev, "nr-irqs", SPAPR_NR_XIRQS + SPAPR_IRQ_NR_IPIS);
/*
* 8 XIVE END structures per CPU. One for each available
diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c
index 3f05081bad..0f22fa61a4 100644
--- a/hw/ppc/spapr_vio.c
+++ b/hw/ppc/spapr_vio.c
@@ -564,7 +564,7 @@ SpaprVioBus *spapr_vio_bus_init(void)
DeviceState *dev;
/* Create bridge device */
- dev = qdev_new(TYPE_SPAPR_VIO_BRIDGE);
+ dev = qdev_new_orphan(TYPE_SPAPR_VIO_BRIDGE);
/* Create bus on bridge device */
qbus = qbus_new(TYPE_SPAPR_VIO_BUS, dev, "spapr-vio");
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index 09686360e1..d7fd72d353 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -84,7 +84,7 @@ static PowerPCCPU *ppc440_init_xilinx(const char *cpu_type, uint32_t sysclk)
ppc_dcr_init(env, NULL, NULL);
/* interrupt controller */
- uicdev = qdev_new(TYPE_PPC_UIC);
+ uicdev = qdev_new_orphan(TYPE_PPC_UIC);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(uicdev), cpu, &error_fatal);
object_unref(OBJECT(uicdev));
uicsbd = SYS_BUS_DEVICE(uicdev);
@@ -218,7 +218,7 @@ static void virtex_init(MachineState *machine)
64 * KiB, 1, 0x89, 0x18, 0x0000, 0x0, 1);
cpu_irq = qdev_get_gpio_in(DEVICE(cpu), PPC40x_INPUT_INT);
- dev = qdev_new("xlnx.xps-intc");
+ dev = qdev_new_orphan("xlnx.xps-intc");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_BIG);
qdev_prop_set_uint32(dev, "kind-of-intr", 0);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -232,7 +232,7 @@ static void virtex_init(MachineState *machine)
115200, serial_hd(0), DEVICE_LITTLE_ENDIAN);
/* 2 timers at irq 2 @ 62 Mhz. */
- dev = qdev_new("xlnx.xps-timer");
+ dev = qdev_new_orphan("xlnx.xps-timer");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_BIG);
qdev_prop_set_uint32(dev, "one-timer-only", 0);
qdev_prop_set_uint32(dev, "clock-frequency", 62 * 1000000);
diff --git a/hw/remote/machine.c b/hw/remote/machine.c
index df08f64019..28cb48a4f6 100644
--- a/hw/remote/machine.c
+++ b/hw/remote/machine.c
@@ -39,7 +39,7 @@ static void remote_machine_init(MachineState *machine)
pci_memory = g_new(MemoryRegion, 1);
memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
- rem_host = REMOTE_PCIHOST(qdev_new(TYPE_REMOTE_PCIHOST));
+ rem_host = REMOTE_PCIHOST(qdev_new_orphan(TYPE_REMOTE_PCIHOST));
rem_host->mr_pci_mem = pci_memory;
rem_host->mr_sys_mem = system_memory;
diff --git a/hw/riscv/boston-aia.c b/hw/riscv/boston-aia.c
index 965d0f5699..0fbb44c5df 100644
--- a/hw/riscv/boston-aia.c
+++ b/hw/riscv/boston-aia.c
@@ -305,7 +305,7 @@ xilinx_pcie_init(MemoryRegion *sys_mem, uint32_t bus_nr,
DeviceState *dev;
MemoryRegion *cfg, *mmio;
- dev = qdev_new(TYPE_XILINX_PCIE_HOST);
+ dev = qdev_new_orphan(TYPE_XILINX_PCIE_HOST);
qdev_prop_set_uint32(dev, "bus_nr", bus_nr);
qdev_prop_set_uint64(dev, "cfg_base", cfg_base);
@@ -352,7 +352,7 @@ static void boston_mach_init(MachineState *machine)
exit(1);
}
- dev = qdev_new(TYPE_MIPS_BOSTON_AIA);
+ dev = qdev_new_orphan(TYPE_MIPS_BOSTON_AIA);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
s = BOSTON(dev);
diff --git a/hw/riscv/microblaze-v-generic.c b/hw/riscv/microblaze-v-generic.c
index d33ac39a68..5864007f01 100644
--- a/hw/riscv/microblaze-v-generic.c
+++ b/hw/riscv/microblaze-v-generic.c
@@ -79,7 +79,7 @@ static void mb_v_generic_init(MachineState *machine)
ram_size, &error_fatal);
memory_region_add_subregion(sysmem, ddr_base, phys_ram);
- dev = qdev_new("xlnx.xps-intc");
+ dev = qdev_new_orphan("xlnx.xps-intc");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_uint32(dev, "kind-of-intr",
1 << UARTLITE_IRQ);
@@ -92,7 +92,7 @@ static void mb_v_generic_init(MachineState *machine)
}
/* Uartlite */
- dev = qdev_new(TYPE_XILINX_UARTLITE);
+ dev = qdev_new_orphan(TYPE_XILINX_UARTLITE);
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -105,7 +105,7 @@ static void mb_v_generic_init(MachineState *machine)
DEVICE_LITTLE_ENDIAN);
/* 2 timers at irq 0 @ 100 Mhz. */
- dev = qdev_new("xlnx.xps-timer");
+ dev = qdev_new_orphan("xlnx.xps-timer");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_uint32(dev, "one-timer-only", 0);
qdev_prop_set_uint32(dev, "clock-frequency", 100000000);
@@ -114,7 +114,7 @@ static void mb_v_generic_init(MachineState *machine)
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[TIMER_IRQ]);
/* 2 timers at irq 3 @ 100 Mhz. */
- dev = qdev_new("xlnx.xps-timer");
+ dev = qdev_new_orphan("xlnx.xps-timer");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_uint32(dev, "one-timer-only", 0);
qdev_prop_set_uint32(dev, "clock-frequency", 100000000);
@@ -123,7 +123,7 @@ static void mb_v_generic_init(MachineState *machine)
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[TIMER_IRQ2]);
/* Emaclite */
- dev = qdev_new("xlnx.xps-ethernetlite");
+ dev = qdev_new_orphan("xlnx.xps-ethernetlite");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qemu_configure_nic_device(dev, true, NULL);
qdev_prop_set_uint32(dev, "tx-ping-pong", 0);
@@ -133,8 +133,8 @@ static void mb_v_generic_init(MachineState *machine)
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[ETHLITE_IRQ]);
/* axi ethernet and dma initialization. */
- eth0 = qdev_new("xlnx.axi-ethernet");
- dma = qdev_new("xlnx.axi-dma");
+ eth0 = qdev_new_orphan("xlnx.axi-ethernet");
+ dma = qdev_new_orphan("xlnx.axi-dma");
/* FIXME: attach to the sysbus instead */
object_property_add_child(qdev_get_machine(), "xilinx-eth", OBJECT(eth0));
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index 4017129c83..cc93b5c2ba 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -580,7 +580,7 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
/* Attach an SD card */
if (dinfo) {
CadenceSDHCIState *sdhci = &(s->soc.sdhci);
- DeviceState *card = qdev_new(TYPE_SD_CARD);
+ DeviceState *card = qdev_new_orphan(TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index 99423ef472..db6d984f94 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -593,7 +593,7 @@ static void sifive_u_machine_init(MachineState *machine)
sizeof(reset_vec), kernel_entry);
/* Connect an SPI flash to SPI0 */
- flash_dev = qdev_new("is25wp256");
+ flash_dev = qdev_new_orphan("is25wp256");
dinfo = drive_get(IF_MTD, 0, 0);
if (dinfo) {
qdev_prop_set_drive_err(flash_dev, "drive",
@@ -613,7 +613,7 @@ static void sifive_u_machine_init(MachineState *machine)
dinfo = drive_get(IF_SD, 0, 0);
blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
- card_dev = qdev_new(TYPE_SD_CARD_SPI);
+ card_dev = qdev_new_orphan(TYPE_SD_CARD_SPI);
qdev_prop_set_drive_err(card_dev, "drive", blk, &error_fatal);
qdev_realize_and_unref(card_dev,
qdev_get_child_bus(sd_dev, "sd-bus"),
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index bd9f77aad3..449cb52201 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -126,7 +126,7 @@ static PFlashCFI01 *virt_flash_create1(RISCVVirtState *s,
* Create a single flash device. We use the same parameters as
* the flash devices on the ARM virt board.
*/
- DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE);
qdev_prop_set_uint8(dev, "width", 4);
@@ -1051,7 +1051,7 @@ static inline DeviceState *gpex_pcie_init(MemoryRegion *sys_mem,
qemu_irq irq;
int i;
- dev = qdev_new(TYPE_GPEX_HOST);
+ dev = qdev_new_orphan(TYPE_GPEX_HOST);
/* Set GPEX object properties for the virt machine */
object_property_set_uint(OBJECT(dev), PCI_HOST_ECAM_BASE,
@@ -1143,7 +1143,7 @@ static void create_platform_bus(RISCVVirtState *s, DeviceState *irqchip)
int i;
MemoryRegion *sysmem = get_system_memory();
- dev = qdev_new(TYPE_PLATFORM_BUS_DEVICE);
+ dev = qdev_new_orphan(TYPE_PLATFORM_BUS_DEVICE);
dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE);
qdev_prop_set_uint32(dev, "num_irqs", VIRT_PLATFORM_BUS_NUM_IRQS);
qdev_prop_set_uint32(dev, "mmio_size", s->memmap[VIRT_PLATFORM_BUS].size);
@@ -1509,7 +1509,7 @@ static void virt_machine_init(MachineState *machine)
}
if (virt_is_iommu_sys_enabled(s)) {
- DeviceState *iommu_sys = qdev_new(TYPE_RISCV_IOMMU_SYS);
+ DeviceState *iommu_sys = qdev_new_orphan(TYPE_RISCV_IOMMU_SYS);
object_property_set_uint(OBJECT(iommu_sys), "addr",
s->memmap[VIRT_IOMMU_SYS].base,
diff --git a/hw/rtc/sun4v-rtc.c b/hw/rtc/sun4v-rtc.c
index 3a586adf02..257f70885d 100644
--- a/hw/rtc/sun4v-rtc.c
+++ b/hw/rtc/sun4v-rtc.c
@@ -57,7 +57,7 @@ void sun4v_rtc_init(hwaddr addr)
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new(TYPE_SUN4V_RTC);
+ dev = qdev_new_orphan(TYPE_SUN4V_RTC);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
diff --git a/hw/s390x/ap-bridge.c b/hw/s390x/ap-bridge.c
index c7e49d966b..ce9b09240a 100644
--- a/hw/s390x/ap-bridge.c
+++ b/hw/s390x/ap-bridge.c
@@ -49,7 +49,7 @@ void s390_init_ap(void)
}
/* Create bridge device */
- dev = qdev_new(TYPE_AP_BRIDGE);
+ dev = qdev_new_orphan(TYPE_AP_BRIDGE);
object_property_add_child(qdev_get_machine(), TYPE_AP_BRIDGE,
OBJECT(dev));
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/s390x/css-bridge.c b/hw/s390x/css-bridge.c
index 440fefb7d0..c6be24e5cb 100644
--- a/hw/s390x/css-bridge.c
+++ b/hw/s390x/css-bridge.c
@@ -92,7 +92,7 @@ VirtualCssBus *virtual_css_bus_init(void)
DeviceState *dev;
/* Create bridge device */
- dev = qdev_new(TYPE_VIRTUAL_CSS_BRIDGE);
+ dev = qdev_new_orphan(TYPE_VIRTUAL_CSS_BRIDGE);
object_property_add_child(qdev_get_machine(), TYPE_VIRTUAL_CSS_BRIDGE,
OBJECT(dev));
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index eff980fdfe..bc335ca883 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -967,7 +967,7 @@ static S390PCIBusDevice *s390_pci_device_new(S390pciState *s,
Error *local_err = NULL;
DeviceState *dev;
- dev = qdev_try_new(TYPE_S390_PCI_DEVICE);
+ dev = qdev_try_new_orphan(TYPE_S390_PCI_DEVICE);
if (!dev) {
error_setg(errp, "zPCI device could not be created");
return NULL;
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 25a9fa4955..f9eb6cb411 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -253,7 +253,7 @@ static void s390_create_sclpconsole(SCLPDevice *sclp,
BusState *ev_fac_bus = sclp_get_event_facility_bus(ef);
DeviceState *dev;
- dev = qdev_new(type);
+ dev = qdev_new_orphan(type);
object_property_add_child(OBJECT(ef), type, OBJECT(dev));
qdev_prop_set_chr(dev, "chardev", chardev);
qdev_realize_and_unref(dev, ev_fac_bus, &error_fatal);
@@ -265,7 +265,7 @@ static void s390_create_sclpcpi(SCLPDevice *sclp)
BusState *ev_fac_bus = sclp_get_event_facility_bus(ef);
DeviceState *dev;
- dev = qdev_new(TYPE_SCLP_EVENT_CPI);
+ dev = qdev_new_orphan(TYPE_SCLP_EVENT_CPI);
object_property_add_child(OBJECT(ef), "sclpcpi", OBJECT(dev));
qdev_realize_and_unref(dev, ev_fac_bus, &error_fatal);
}
@@ -309,7 +309,7 @@ static void ccw_init(MachineState *machine)
machine->firmware ?: "s390-ccw.img",
true);
- dev = qdev_new(TYPE_S390_PCI_HOST_BRIDGE);
+ dev = qdev_new_orphan(TYPE_S390_PCI_HOST_BRIDGE);
object_property_add_child(qdev_get_machine(), TYPE_S390_PCI_HOST_BRIDGE,
OBJECT(dev));
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/scsi/lasi_ncr710.c b/hw/scsi/lasi_ncr710.c
index 4fde2265b5..e1a1f68aaa 100644
--- a/hw/scsi/lasi_ncr710.c
+++ b/hw/scsi/lasi_ncr710.c
@@ -231,7 +231,7 @@ DeviceState *lasi_ncr710_init(MemoryRegion *addr_space, hwaddr hpa,
LasiNCR710State *s;
SysBusDevice *sbd;
- dev = qdev_new(TYPE_LASI_NCR710);
+ dev = qdev_new_orphan(TYPE_LASI_NCR710);
s = LASI_NCR710(dev);
sbd = SYS_BUS_DEVICE(dev);
s->lasi_irq = irq;
diff --git a/hw/scsi/ncr53c710.c b/hw/scsi/ncr53c710.c
index 57967e7a84..54ce2df641 100644
--- a/hw/scsi/ncr53c710.c
+++ b/hw/scsi/ncr53c710.c
@@ -2376,7 +2376,7 @@ DeviceState *ncr710_device_create_sysbus(hwaddr addr, qemu_irq irq)
DeviceState *dev;
SysBusDevice *sysbus;
- dev = qdev_new(TYPE_SYSBUS_NCR710_SCSI);
+ dev = qdev_new_orphan(TYPE_SYSBUS_NCR710_SCSI);
sysbus = SYS_BUS_DEVICE(dev);
qdev_realize_and_unref(dev, NULL, &error_abort);
@@ -2394,7 +2394,7 @@ DeviceState *ncr53c710_init(MemoryRegion *address_space, hwaddr addr,
/* trace_ncr710_device_init(addr); */
- dev = qdev_new(TYPE_SYSBUS_NCR710_SCSI);
+ dev = qdev_new_orphan(TYPE_SYSBUS_NCR710_SCSI);
sysbus = SYS_BUS_DEVICE(dev);
qdev_realize_and_unref(dev, NULL, &error_abort);
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index dccb2f25b2..806a20baee 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -445,7 +445,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
driver = "scsi-hd";
}
}
- dev = qdev_new(driver);
+ dev = qdev_new_orphan(driver);
name = g_strdup_printf("legacy[%d]", unit);
object_property_add_child(OBJECT(bus), name, OBJECT(dev));
g_free(name);
diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c
index b4c8f94d22..492d7d18a2 100644
--- a/hw/scsi/spapr_vscsi.c
+++ b/hw/scsi/spapr_vscsi.c
@@ -1235,7 +1235,7 @@ void spapr_vscsi_create(SpaprVioBus *bus)
{
DeviceState *dev;
- dev = qdev_new("spapr-vscsi");
+ dev = qdev_new_orphan("spapr-vscsi");
qdev_realize_and_unref(dev, &bus->bus, &error_fatal);
scsi_bus_legacy_handle_cmdline(&VIO_SPAPR_VSCSI_DEVICE(dev)->bus);
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index 99afe3618e..0b502ca392 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -266,7 +266,7 @@ static void r2d_init(MachineState *machine)
s = sh7750_init(cpu, address_space_mem);
fpga = r2d_fpga_init(address_space_mem, 0x04000000, sh7750_irl(s));
- dev = qdev_new("sh_pci");
+ dev = qdev_new_orphan("sh_pci");
busdev = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(busdev, &error_fatal);
pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci"));
@@ -277,7 +277,7 @@ static void r2d_init(MachineState *machine)
sysbus_connect_irq(busdev, 2, &fpga->irq[PCI_INTC]);
sysbus_connect_irq(busdev, 3, &fpga->irq[PCI_INTD]);
- dev = qdev_new("sysbus-sm501");
+ dev = qdev_new_orphan("sysbus-sm501");
busdev = SYS_BUS_DEVICE(dev);
qdev_prop_set_uint32(dev, "vram-size", SM501_VRAM_SIZE);
qdev_prop_set_uint64(dev, "dma-offset", 0x10000000);
@@ -289,7 +289,7 @@ static void r2d_init(MachineState *machine)
/* onboard CF (True IDE mode, Master only). */
dinfo = drive_get(IF_IDE, 0, 0);
- dev = qdev_new("mmio-ide");
+ dev = qdev_new_orphan("mmio-ide");
busdev = SYS_BUS_DEVICE(dev);
sysbus_connect_irq(busdev, 0, &fpga->irq[CF_IDE]);
qdev_prop_set_uint32(dev, "shift", 1);
diff --git a/hw/sh4/sh7750.c b/hw/sh4/sh7750.c
index 6aa7f63773..3eb47bc660 100644
--- a/hw/sh4/sh7750.c
+++ b/hw/sh4/sh7750.c
@@ -762,7 +762,7 @@ SH7750State *sh7750_init(SuperHCPU *cpu, MemoryRegion *sysmem)
cpu->env.intc_handle = &s->intc;
/* SCI */
- dev = qdev_new(TYPE_SH_SERIAL);
+ dev = qdev_new_orphan(TYPE_SH_SERIAL);
dev->id = g_strdup("sci");
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
sb = SYS_BUS_DEVICE(dev);
@@ -779,7 +779,7 @@ SH7750State *sh7750_init(SuperHCPU *cpu, MemoryRegion *sysmem)
qdev_connect_gpio_out_named(dev, "tei", 0, s->intc.irqs[SCI1_TEI]);
/* SCIF */
- dev = qdev_new(TYPE_SH_SERIAL);
+ dev = qdev_new_orphan(TYPE_SH_SERIAL);
dev->id = g_strdup("scif");
qdev_prop_set_chr(dev, "chardev", serial_hd(1));
qdev_prop_set_uint8(dev, "features", SH_SERIAL_FEAT_SCIF);
diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index d4a6e91759..d921cd8dc6 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -292,14 +292,14 @@ static void leon3_generic_hw_init(MachineState *machine)
qemu_register_reset(leon3_cpu_reset, &reset_info->info[i]);
}
- ahb_pnp = GRLIB_AHB_PNP(qdev_new(TYPE_GRLIB_AHB_PNP));
+ ahb_pnp = GRLIB_AHB_PNP(qdev_new_orphan(TYPE_GRLIB_AHB_PNP));
sysbus_realize_and_unref(SYS_BUS_DEVICE(ahb_pnp), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(ahb_pnp), 0, LEON3_AHB_PNP_OFFSET);
grlib_ahb_pnp_add_entry(ahb_pnp, 0, 0, GRLIB_VENDOR_GAISLER,
GRLIB_LEON3_DEV, GRLIB_AHB_MASTER,
GRLIB_CPU_AREA);
- apb_pnp = GRLIB_APB_PNP(qdev_new(TYPE_GRLIB_APB_PNP));
+ apb_pnp = GRLIB_APB_PNP(qdev_new_orphan(TYPE_GRLIB_APB_PNP));
sysbus_realize_and_unref(SYS_BUS_DEVICE(apb_pnp), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(apb_pnp), 0, LEON3_APB_PNP_OFFSET);
grlib_ahb_pnp_add_entry(ahb_pnp, LEON3_APB_PNP_OFFSET, 0xFFF,
@@ -307,7 +307,7 @@ static void leon3_generic_hw_init(MachineState *machine)
GRLIB_AHB_SLAVE, GRLIB_AHBMEM_AREA);
/* Allocate IRQ manager */
- irqmpdev = qdev_new(TYPE_GRLIB_IRQMP);
+ irqmpdev = qdev_new_orphan(TYPE_GRLIB_IRQMP);
object_property_set_int(OBJECT(irqmpdev), "ncpus", machine->smp.cpus,
&error_fatal);
sysbus_realize_and_unref(SYS_BUS_DEVICE(irqmpdev), &error_fatal);
@@ -406,7 +406,7 @@ static void leon3_generic_hw_init(MachineState *machine)
}
/* Allocate timers */
- dev = qdev_new(TYPE_GRLIB_GPTIMER);
+ dev = qdev_new_orphan(TYPE_GRLIB_GPTIMER);
qdev_prop_set_uint32(dev, "nr-timers", LEON3_TIMER_COUNT);
qdev_prop_set_uint32(dev, "frequency", CPU_CLK);
qdev_prop_set_uint32(dev, "irq-line", LEON3_TIMER_IRQ);
@@ -423,7 +423,7 @@ static void leon3_generic_hw_init(MachineState *machine)
0, LEON3_TIMER_IRQ, GRLIB_APBIO_AREA);
/* Allocate uart */
- dev = qdev_new(TYPE_GRLIB_APB_UART);
+ dev = qdev_new_orphan(TYPE_GRLIB_APB_UART);
qdev_prop_set_chr(dev, "chrdev", serial_hd(0));
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, LEON3_UART_OFFSET);
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 550acdff6d..69a287937e 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -280,7 +280,7 @@ static void *iommu_init(hwaddr addr, uint32_t version, qemu_irq irq)
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new(TYPE_SUN4M_IOMMU);
+ dev = qdev_new_orphan(TYPE_SUN4M_IOMMU);
qdev_prop_set_uint32(dev, "version", version);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -302,7 +302,7 @@ static void *sparc32_dma_init(hwaddr dma_base,
SysBusPCNetState *lance;
NICInfo *nd = qemu_find_nic_info("lance", true, NULL);
- dma = qdev_new(TYPE_SPARC32_DMA);
+ dma = qdev_new_orphan(TYPE_SPARC32_DMA);
espdma = SPARC32_ESPDMA_DEVICE(object_resolve_path_component(
OBJECT(dma), "espdma"));
@@ -347,7 +347,7 @@ static DeviceState *slavio_intctl_init(hwaddr addr,
SysBusDevice *s;
unsigned int i, j;
- dev = qdev_new("slavio_intctl");
+ dev = qdev_new_orphan("slavio_intctl");
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -376,7 +376,7 @@ static void slavio_timer_init_all(hwaddr addr, qemu_irq master_irq,
SysBusDevice *s;
unsigned int i;
- dev = qdev_new("slavio_timer");
+ dev = qdev_new_orphan("slavio_timer");
qdev_prop_set_uint32(dev, "num_cpus", num_cpus);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -414,7 +414,7 @@ static void slavio_misc_init(hwaddr base,
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new("slavio_misc");
+ dev = qdev_new_orphan("slavio_misc");
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
if (base) {
@@ -451,7 +451,7 @@ static void ecc_init(hwaddr base, qemu_irq irq, uint32_t version)
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new("eccmemctl");
+ dev = qdev_new_orphan("eccmemctl");
qdev_prop_set_uint32(dev, "version", version);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -467,7 +467,7 @@ static void apc_init(hwaddr power_base, qemu_irq cpu_halt)
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new("apc");
+ dev = qdev_new_orphan("apc");
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
/* Power management (APC) XXX: not a Slavio device */
@@ -481,7 +481,7 @@ static void tcx_init(hwaddr addr, qemu_irq irq, int vram_size, int width,
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new("sun-tcx");
+ dev = qdev_new_orphan("sun-tcx");
qdev_prop_set_uint32(dev, "vram_size", vram_size);
qdev_prop_set_uint16(dev, "width", width);
qdev_prop_set_uint16(dev, "height", height);
@@ -533,7 +533,7 @@ static void cg3_init(hwaddr addr, qemu_irq irq, int vram_size, int width,
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new("cgthree");
+ dev = qdev_new_orphan("cgthree");
qdev_prop_set_uint32(dev, "vram-size", vram_size);
qdev_prop_set_uint16(dev, "width", width);
qdev_prop_set_uint16(dev, "height", height);
@@ -562,7 +562,7 @@ static void idreg_init(hwaddr addr)
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new(TYPE_MACIO_ID_REGISTER);
+ dev = qdev_new_orphan(TYPE_MACIO_ID_REGISTER);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -621,7 +621,7 @@ static void afx_init(hwaddr addr)
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new(TYPE_TCX_AFX);
+ dev = qdev_new_orphan(TYPE_TCX_AFX);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -678,7 +678,7 @@ static void prom_init(hwaddr addr, const char *bios_name)
char *filename;
int ret;
- dev = qdev_new(TYPE_OPENPROM);
+ dev = qdev_new_orphan(TYPE_OPENPROM);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -835,7 +835,7 @@ static void sun4m_hw_init(MachineState *machine)
}
/* Create and map RAM frontend */
- dev = qdev_new("memory");
+ dev = qdev_new_orphan("memory");
object_property_set_link(OBJECT(dev), "memdev", OBJECT(ram_memdev), &error_fatal);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0);
@@ -946,7 +946,7 @@ static void sun4m_hw_init(MachineState *machine)
create_unimplemented_device("sun-sx", hwdef->sx_base, 0x2000);
}
- dev = qdev_new("sysbus-m48t08");
+ dev = qdev_new_orphan("sysbus-m48t08");
qdev_prop_set_int32(dev, "base-year", 1968);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -958,7 +958,7 @@ static void sun4m_hw_init(MachineState *machine)
/* Slavio TTYA (base+4, Linux ttyS0) is the first QEMU serial device
Slavio TTYB (base+0, Linux ttyS1) is the second QEMU serial device */
- dev = qdev_new(TYPE_ESCC);
+ dev = qdev_new_orphan(TYPE_ESCC);
qdev_prop_set_uint32(dev, "disabled", !machine->enable_graphics);
qdev_prop_set_uint32(dev, "frequency", ESCC_CLOCK);
qdev_prop_set_uint32(dev, "it_shift", 1);
@@ -971,14 +971,14 @@ static void sun4m_hw_init(MachineState *machine)
sysbus_mmio_map(s, 0, hwdef->ms_kb_base);
/* Logically OR both its IRQs together */
- ms_kb_orgate = qdev_new(TYPE_OR_IRQ);
+ ms_kb_orgate = qdev_new_orphan(TYPE_OR_IRQ);
object_property_set_int(OBJECT(ms_kb_orgate), "num-lines", 2, &error_fatal);
qdev_realize_and_unref(ms_kb_orgate, NULL, &error_fatal);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(ms_kb_orgate, 0));
sysbus_connect_irq(s, 1, qdev_get_gpio_in(ms_kb_orgate, 1));
qdev_connect_gpio_out(ms_kb_orgate, 0, slavio_irq[14]);
- dev = qdev_new(TYPE_ESCC);
+ dev = qdev_new_orphan(TYPE_ESCC);
qdev_prop_set_uint32(dev, "disabled", 0);
qdev_prop_set_uint32(dev, "frequency", ESCC_CLOCK);
qdev_prop_set_uint32(dev, "it_shift", 1);
@@ -992,7 +992,7 @@ static void sun4m_hw_init(MachineState *machine)
sysbus_mmio_map(s, 0, hwdef->serial_base);
/* Logically OR both its IRQs together */
- serial_orgate = qdev_new(TYPE_OR_IRQ);
+ serial_orgate = qdev_new_orphan(TYPE_OR_IRQ);
object_property_set_int(OBJECT(serial_orgate), "num-lines", 2,
&error_fatal);
qdev_realize_and_unref(serial_orgate, NULL, &error_fatal);
@@ -1051,7 +1051,7 @@ static void sun4m_hw_init(MachineState *machine)
ecc_init(hwdef->ecc_base, slavio_irq[28],
hwdef->ecc_version);
- dev = qdev_new(TYPE_FW_CFG_MEM);
+ dev = qdev_new_orphan(TYPE_FW_CFG_MEM);
fw_cfg = FW_CFG(dev);
qdev_prop_set_uint32(dev, "data_width", 1);
qdev_prop_set_bit(dev, "dma_enabled", false);
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index d69ed9a81a..bd73d26e2c 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -342,7 +342,7 @@ static void ebus_realize(PCIDevice *pci_dev, Error **errp)
isa_fdc_init_drives(isa_dev, fd);
/* Power */
- dev = qdev_new(TYPE_SUN4U_POWER);
+ dev = qdev_new_orphan(TYPE_SUN4U_POWER);
sbd = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(sbd, &error_fatal);
memory_region_add_subregion(pci_address_space_io(pci_dev), 0x7240,
@@ -423,7 +423,7 @@ static void prom_init(hwaddr addr, const char *bios_name)
char *filename;
int ret;
- dev = qdev_new(TYPE_OPENPROM);
+ dev = qdev_new_orphan(TYPE_OPENPROM);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -507,7 +507,7 @@ static void ram_init(hwaddr addr, ram_addr_t RAM_size)
RamDevice *d;
/* allocate RAM */
- dev = qdev_new(TYPE_SUN4U_MEMORY);
+ dev = qdev_new_orphan(TYPE_SUN4U_MEMORY);
s = SYS_BUS_DEVICE(dev);
d = SUN4U_RAM(dev);
@@ -559,7 +559,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
cpu = sparc64_cpu_devinit(machine->cpu_type, hwdef->prom_addr);
/* IOMMU */
- iommu = qdev_new(TYPE_SUN4U_IOMMU);
+ iommu = qdev_new_orphan(TYPE_SUN4U_IOMMU);
sysbus_realize_and_unref(SYS_BUS_DEVICE(iommu), &error_fatal);
/* set up devices */
@@ -568,7 +568,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
prom_init(hwdef->prom_addr, machine->firmware);
/* Init sabre (PCI host bridge) */
- sabre = SABRE(qdev_new(TYPE_SABRE));
+ sabre = SABRE(qdev_new_orphan(TYPE_SABRE));
qdev_prop_set_uint64(DEVICE(sabre), "special-base", PBM_SPECIAL_BASE);
qdev_prop_set_uint64(DEVICE(sabre), "mem-base", PBM_MEM_BASE);
object_property_set_link(OBJECT(sabre), "iommu", OBJECT(iommu),
@@ -654,7 +654,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
pci_ide_create_devs(pci_dev);
/* Map NVRAM into I/O (ebus) space */
- dev = qdev_new("sysbus-m48t59");
+ dev = qdev_new_orphan("sysbus-m48t59");
qdev_prop_set_int32(dev, "base-year", 1968);
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
@@ -689,7 +689,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
graphic_width, graphic_height, graphic_depth,
(uint8_t *)&macaddr);
- dev = qdev_new(TYPE_FW_CFG_IO);
+ dev = qdev_new_orphan(TYPE_FW_CFG_IO);
qdev_prop_set_bit(dev, "dma_enabled", false);
object_property_add_child(OBJECT(ebus), TYPE_FW_CFG, OBJECT(dev));
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
index 3a4fade2d5..b1935271f0 100644
--- a/hw/ssi/ssi.c
+++ b/hw/ssi/ssi.c
@@ -140,7 +140,7 @@ bool ssi_realize_and_unref(DeviceState *dev, SSIBus *bus, Error **errp)
DeviceState *ssi_create_peripheral(SSIBus *bus, const char *name)
{
- DeviceState *dev = qdev_new(name);
+ DeviceState *dev = qdev_new_orphan(name);
ssi_realize_and_unref(dev, bus, &error_fatal);
return dev;
diff --git a/hw/tricore/tricore_testboard.c b/hw/tricore/tricore_testboard.c
index d5d796c8ee..afed9ad0ae 100644
--- a/hw/tricore/tricore_testboard.c
+++ b/hw/tricore/tricore_testboard.c
@@ -89,7 +89,7 @@ static void tricore_testboard_init(MachineState *machine, int board_id)
memory_region_add_subregion(sysmem, 0xf0050000, pcp_data);
memory_region_add_subregion(sysmem, 0xf0060000, pcp_text);
- test_dev = TRICORE_TESTDEVICE(qdev_new(TYPE_TRICORE_TESTDEVICE));
+ test_dev = TRICORE_TESTDEVICE(qdev_new_orphan(TYPE_TRICORE_TESTDEVICE));
memory_region_add_subregion(sysmem, 0xf0000000, &test_dev->iomem);
diff --git a/hw/ufs/lu.c b/hw/ufs/lu.c
index 13f4a90145..219f74e4f3 100644
--- a/hw/ufs/lu.c
+++ b/hw/ufs/lu.c
@@ -472,7 +472,7 @@ static void ufs_init_scsi_device(UfsLu *lu, BlockBackend *blk, Error **errp)
* The ufs-lu is the device that is wrapping the scsi-hd. It owns a virtual
* SCSI bus that serves the scsi-hd.
*/
- scsi_dev = qdev_new("scsi-hd");
+ scsi_dev = qdev_new_orphan("scsi-hd");
object_property_add_child(OBJECT(&lu->bus), "ufs-scsi", OBJECT(scsi_dev));
qdev_prop_set_uint32(scsi_dev, "physical_block_size", UFS_BLOCK_SIZE);
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index 3b6fbd46ac..d45cce7666 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -410,7 +410,7 @@ void usb_claim_port(USBDevice *dev, Error **errp)
} else {
if (bus->nfree == 1 && strcmp(object_get_typename(OBJECT(dev)), "usb-hub") != 0) {
/* Create a new hub and chain it on */
- hub = USB_DEVICE(qdev_try_new("usb-hub"));
+ hub = USB_DEVICE(qdev_try_new_orphan("usb-hub"));
if (hub) {
usb_realize_and_unref(hub, bus, NULL);
}
@@ -662,7 +662,7 @@ USBDevice *usbdevice_create(const char *driver)
}
dev = f->usbdevice_init ? f->usbdevice_init()
- : USB_DEVICE(qdev_new(f->name));
+ : USB_DEVICE(qdev_new_orphan(f->name));
if (!dev) {
error_report("Failed to create USB device '%s'", f->name);
return NULL;
diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c
index b238cb7937..81897b2d76 100644
--- a/hw/usb/dev-serial.c
+++ b/hw/usb/dev-serial.c
@@ -622,7 +622,7 @@ static USBDevice *usb_braille_init(void)
return NULL;
}
- dev = USB_DEVICE(qdev_new("usb-braille"));
+ dev = USB_DEVICE(qdev_new_orphan("usb-braille"));
qdev_prop_set_chr(&dev->qdev, "chardev", cdrv);
return dev;
}
diff --git a/hw/vmapple/vmapple.c b/hw/vmapple/vmapple.c
index 607181f517..9f69ab2bc7 100644
--- a/hw/vmapple/vmapple.c
+++ b/hw/vmapple/vmapple.c
@@ -155,7 +155,7 @@ static void create_bdif(VMAppleMachineState *vms, MemoryRegion *mem)
}
/* PV backdoor device */
- bdif = qdev_new(TYPE_VMAPPLE_BDIF);
+ bdif = qdev_new_orphan(TYPE_VMAPPLE_BDIF);
bdif_sb = SYS_BUS_DEVICE(bdif);
sysbus_mmio_map(bdif_sb, 0, vms->memmap[VMAPPLE_BDOOR].base);
@@ -169,7 +169,7 @@ static void create_pvpanic(VMAppleMachineState *vms, MemoryRegion *mem)
{
SysBusDevice *pvpanic;
- vms->pvpanic = qdev_new(TYPE_PVPANIC_MMIO_DEVICE);
+ vms->pvpanic = qdev_new_orphan(TYPE_PVPANIC_MMIO_DEVICE);
pvpanic = SYS_BUS_DEVICE(vms->pvpanic);
sysbus_mmio_map(pvpanic, 0, vms->memmap[VMAPPLE_PVPANIC].base);
@@ -184,7 +184,7 @@ static bool create_cfg(VMAppleMachineState *vms, MemoryRegion *mem,
MachineState *machine = MACHINE(vms);
uint32_t rnd = 1;
- vms->cfg = qdev_new(TYPE_VMAPPLE_CFG);
+ vms->cfg = qdev_new_orphan(TYPE_VMAPPLE_CFG);
cfg = SYS_BUS_DEVICE(vms->cfg);
sysbus_mmio_map(cfg, 0, vms->memmap[VMAPPLE_CONFIG].base);
@@ -209,7 +209,7 @@ static void create_gfx(VMAppleMachineState *vms, MemoryRegion *mem)
int irq_iosfc = vms->irqmap[VMAPPLE_APV_IOSFC];
SysBusDevice *gfx;
- gfx = SYS_BUS_DEVICE(qdev_new("apple-gfx-mmio"));
+ gfx = SYS_BUS_DEVICE(qdev_new_orphan("apple-gfx-mmio"));
sysbus_mmio_map(gfx, 0, vms->memmap[VMAPPLE_APV_GFX].base);
sysbus_mmio_map(gfx, 1, vms->memmap[VMAPPLE_APV_IOSFC].base);
sysbus_connect_irq(gfx, 0, qdev_get_gpio_in(vms->gic, irq_gfx));
@@ -222,7 +222,7 @@ static void create_aes(VMAppleMachineState *vms, MemoryRegion *mem)
int irq = vms->irqmap[VMAPPLE_AES_1];
SysBusDevice *aes;
- aes = SYS_BUS_DEVICE(qdev_new(TYPE_APPLE_AES));
+ aes = SYS_BUS_DEVICE(qdev_new_orphan(TYPE_APPLE_AES));
sysbus_mmio_map(aes, 0, vms->memmap[VMAPPLE_AES_1].base);
sysbus_mmio_map(aes, 1, vms->memmap[VMAPPLE_AES_2].base);
sysbus_connect_irq(aes, 0, qdev_get_gpio_in(vms->gic, irq));
@@ -243,7 +243,7 @@ static void create_gic(VMAppleMachineState *vms, MemoryRegion *mem)
int i;
unsigned int smp_cpus = ms->smp.cpus;
- vms->gic = qdev_new(gicv3_class_name());
+ vms->gic = qdev_new_orphan(gicv3_class_name());
qdev_prop_set_uint32(vms->gic, "revision", 3);
qdev_prop_set_uint32(vms->gic, "num-cpu", smp_cpus);
/*
@@ -290,7 +290,7 @@ static void create_uart(const VMAppleMachineState *vms, int uart,
{
hwaddr base = vms->memmap[uart].base;
int irq = vms->irqmap[uart];
- DeviceState *dev = qdev_new(TYPE_PL011);
+ DeviceState *dev = qdev_new_orphan(TYPE_PL011);
SysBusDevice *s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", chr);
@@ -323,7 +323,7 @@ static void create_gpio_devices(const VMAppleMachineState *vms, int gpio,
int irq = vms->irqmap[gpio];
SysBusDevice *s;
- pl061_dev = qdev_new("pl061");
+ pl061_dev = qdev_new_orphan("pl061");
/* Pull lines down to 0 if not driven by the PL061 */
qdev_prop_set_uint8(pl061_dev, "pullups", 0);
qdev_prop_set_uint8(pl061_dev, "pulldowns", 0xff);
@@ -384,7 +384,7 @@ static void create_pcie(VMAppleMachineState *vms)
DeviceState *usb_controller;
USBBus *usb_bus;
- dev = qdev_new(TYPE_GPEX_HOST);
+ dev = qdev_new_orphan(TYPE_GPEX_HOST);
qdev_prop_set_uint32(dev, "num-irqs", GPEX_NUM_IRQS);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
@@ -420,7 +420,7 @@ static void create_pcie(VMAppleMachineState *vms)
}
if (defaults_enabled()) {
- usb_controller = qdev_new(TYPE_QEMU_XHCI);
+ usb_controller = qdev_new_orphan(TYPE_QEMU_XHCI);
qdev_realize_and_unref(usb_controller, BUS(pci->bus), &error_fatal);
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
diff --git a/hw/xen/xen-bus.c b/hw/xen/xen-bus.c
index dfad2bc508..746014416b 100644
--- a/hw/xen/xen-bus.c
+++ b/hw/xen/xen-bus.c
@@ -1149,7 +1149,7 @@ type_init(xen_register_types)
void xen_bus_init(void)
{
- DeviceState *dev = qdev_new(TYPE_XEN_BRIDGE);
+ DeviceState *dev = qdev_new_orphan(TYPE_XEN_BRIDGE);
BusState *bus = qbus_new(TYPE_XEN_BUS, dev, NULL);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/hw/xen/xen-legacy-backend.c b/hw/xen/xen-legacy-backend.c
index 7977b52712..29c90a388c 100644
--- a/hw/xen/xen-legacy-backend.c
+++ b/hw/xen/xen-legacy-backend.c
@@ -598,7 +598,7 @@ void xen_be_init(void)
exit(1);
}
- xen_sysdev = qdev_new(TYPE_XENSYSDEV);
+ xen_sysdev = qdev_new_orphan(TYPE_XENSYSDEV);
sysbus_realize_and_unref(SYS_BUS_DEVICE(xen_sysdev), &error_fatal);
xen_sysbus = qbus_new(TYPE_XENSYSBUS, xen_sysdev, "xen-sysbus");
qbus_set_bus_hotplug_handler(xen_sysbus);
diff --git a/hw/xen/xen-pvh-common.c b/hw/xen/xen-pvh-common.c
index cca37202ff..4c9a4fdea8 100644
--- a/hw/xen/xen-pvh-common.c
+++ b/hw/xen/xen-pvh-common.c
@@ -193,7 +193,7 @@ static void xen_enable_tpm(XenPVHMachineState *s)
error_report("Couldn't find tmp0 backend");
return;
}
- dev = qdev_new(TYPE_TPM_TIS_SYSBUS);
+ dev = qdev_new_orphan(TYPE_TPM_TIS_SYSBUS);
/*
* FIXME This use of &err is is wrong. If both calls fail, the
* second will trip error_setv()'s assertion. If just one call
diff --git a/hw/xtensa/virt.c b/hw/xtensa/virt.c
index 271f06e095..e31b783b91 100644
--- a/hw/xtensa/virt.c
+++ b/hw/xtensa/virt.c
@@ -61,7 +61,7 @@ static void create_pcie(MachineState *ms, CPUXtensaState *env, int irq_base,
qemu_irq *extints;
int i;
- dev = qdev_new(TYPE_GPEX_HOST);
+ dev = qdev_new_orphan(TYPE_GPEX_HOST);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
/* Map only the first size_ecam bytes of ECAM space. */
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 8f85fc8ddb..4b1009a398 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -173,7 +173,7 @@ static PFlashCFI01 *xtfpga_flash_init(MemoryRegion *address_space,
DriveInfo *dinfo, int be)
{
SysBusDevice *s;
- DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
qdev_prop_set_uint32(dev, "num-blocks",
diff --git a/include/hw/core/qdev.h b/include/hw/core/qdev.h
index e147622341..839c1b4147 100644
--- a/include/hw/core/qdev.h
+++ b/include/hw/core/qdev.h
@@ -407,7 +407,7 @@ struct BusState {
/*** Board API. This should go away once we have a machine config file. ***/
/**
- * qdev_new: Create a device on the heap
+ * qdev_new_orphan: Create a device on the heap
* @name: device type to create (we assert() that this type exists)
*
* This only allocates the memory and initializes the device state
@@ -416,19 +416,19 @@ struct BusState {
*
* Return: a derived DeviceState object with a reference count of 1.
*/
-DeviceState *qdev_new(const char *name);
+DeviceState *qdev_new_orphan(const char *name);
/**
- * qdev_try_new: Try to create a device on the heap
+ * qdev_try_new_orphan: Try to create a device on the heap
* @name: device type to create
*
- * This is like qdev_new(), except it returns %NULL when type @name
+ * This is like qdev_new_orphan(), except it returns %NULL when type @name
* does not exist, rather than asserting.
*
* Return: a derived DeviceState object with a reference count of 1 or
* NULL if type @name does not exist.
*/
-DeviceState *qdev_try_new(const char *name);
+DeviceState *qdev_try_new_orphan(const char *name);
/**
* qdev_is_realized() - check if device is realized
@@ -454,7 +454,7 @@ static inline bool qdev_is_realized(DeviceState *dev)
* If @bus, plug @dev into @bus. This takes a reference to @dev.
* If @dev has no QOM parent, make one up, taking another reference.
*
- * If you created @dev using qdev_new(), you probably want to use
+ * If you created @dev using qdev_new_orphan(), you probably want to use
* qdev_realize_and_unref() instead.
*
* Return: true on success, else false setting @errp with error
@@ -472,7 +472,7 @@ bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp);
* (private) reference, which is dropped on return regardless of
* success or failure. Intended use::
*
- * dev = qdev_new();
+ * dev = qdev_new_orphan();
* [...]
* qdev_realize_and_unref(dev, bus, errp);
*
diff --git a/include/hw/i2c/i2c.h b/include/hw/i2c/i2c.h
index dd5930f4b5..bcdc4f21a9 100644
--- a/include/hw/i2c/i2c.h
+++ b/include/hw/i2c/i2c.h
@@ -188,7 +188,7 @@ I2CSlave *i2c_slave_create_simple(I2CBus *bus, const char *name, uint8_t addr);
* Call 'realize' on @dev, put it on the specified @bus, and drop the
* reference to it.
*
- * This function is useful if you have created @dev via qdev_new(),
+ * This function is useful if you have created @dev via qdev_new_orphan(),
* i2c_slave_new() or i2c_slave_try_new() (which take a reference to
* the device it returns to you), so that you can set properties on it
* before realizing it. If you don't need to set properties then
diff --git a/include/hw/misc/unimp.h b/include/hw/misc/unimp.h
index 77a5077511..5158d29634 100644
--- a/include/hw/misc/unimp.h
+++ b/include/hw/misc/unimp.h
@@ -42,7 +42,7 @@ static inline void create_unimplemented_device(const char *name,
hwaddr base,
hwaddr size)
{
- DeviceState *dev = qdev_new(TYPE_UNIMPLEMENTED_DEVICE);
+ DeviceState *dev = qdev_new_orphan(TYPE_UNIMPLEMENTED_DEVICE);
qdev_prop_set_string(dev, "name", name);
qdev_prop_set_uint64(dev, "size", size);
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
index 6d6d8ccb3d..153bf0cb9c 100644
--- a/include/hw/ssi/ssi.h
+++ b/include/hw/ssi/ssi.h
@@ -92,7 +92,7 @@ DeviceState *ssi_create_peripheral(SSIBus *bus, const char *name);
* reference to it. Errors are reported via @errp and by returning
* false.
*
- * This function is useful if you have created @dev via qdev_new()
+ * This function is useful if you have created @dev via qdev_new_orphan()
* (which takes a reference to the device it returns to you), so that
* you can set properties on it before realizing it. If you don't need
* to set properties then ssi_create_peripheral() is probably better (as it
diff --git a/include/hw/usb/usb.h b/include/hw/usb/usb.h
index 78e2ceedd7..6ef190523f 100644
--- a/include/hw/usb/usb.h
+++ b/include/hw/usb/usb.h
@@ -586,7 +586,7 @@ static inline bool usb_realize_and_unref(USBDevice *dev, USBBus *bus, Error **er
static inline USBDevice *usb_create_simple(USBBus *bus, const char *name)
{
- USBDevice *dev = USB_DEVICE(qdev_new(name));
+ USBDevice *dev = USB_DEVICE(qdev_new_orphan(name));
usb_realize_and_unref(dev, bus, &error_abort);
return dev;
diff --git a/migration/migration.c b/migration/migration.c
index 9736c14458..bdd163b65d 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -4076,7 +4076,7 @@ static const TypeInfo migration_type = {
.name = TYPE_MIGRATION,
/*
* NOTE: TYPE_MIGRATION is not really a device, as the object is
- * not created using qdev_new(), it is not attached to the qdev
+ * not created using qdev_new_orphan(), it is not attached to the qdev
* device tree, and it is never realized.
*
* TODO: Make this TYPE_OBJECT once QOM provides something like
diff --git a/net/net.c b/net/net.c
index 2892f1730d..e09f0c0d4f 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1214,7 +1214,7 @@ DeviceState *qemu_create_nic_device(const char *typename, bool match_default,
return NULL;
}
- dev = qdev_new(typename);
+ dev = qdev_new_orphan(typename);
qdev_set_nic_properties(dev, nd);
return dev;
}
@@ -1264,7 +1264,7 @@ void qemu_create_nic_bus_devices(BusState *bus, const char *parent_type,
continue;
}
- dev = qdev_new(model);
+ dev = qdev_new_orphan(model);
qdev_set_nic_properties(dev, nd);
qdev_realize_and_unref(dev, bus, &error_fatal);
}
diff --git a/scripts/coccinelle/qom-parent/qdev-new-orphan.cocci b/scripts/coccinelle/qom-parent/qdev-new-orphan.cocci
new file mode 100644
index 0000000000..6d07c03b39
--- /dev/null
+++ b/scripts/coccinelle/qom-parent/qdev-new-orphan.cocci
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+//
+// Rename qdev_new()/qdev_try_new() to qdev_new_orphan()/qdev_try_new_orphan()
+// so that the short name can be reintroduced with a mandatory
+// (parent, id, type) signature.
+//
+// spatch --sp-file scripts/coccinelle/qom-parent/qdev-new-orphan.cocci \
+// --in-place --include-headers --dir .
+
+@@
+@@
+- qdev_new
++ qdev_new_orphan
+
+@@
+@@
+- qdev_try_new
++ qdev_try_new_orphan
diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
index 00fed791cc..adc37d6a89 100644
--- a/system/qdev-monitor.c
+++ b/system/qdev-monitor.c
@@ -707,7 +707,7 @@ DeviceState *qdev_device_add_from_qdict(const QDict *opts,
}
/* create device */
- dev = qdev_new(driver);
+ dev = qdev_new_orphan(driver);
/* Check whether the hotplug is allowed by the machine */
if (phase_check(PHASE_MACHINE_READY) &&
diff --git a/target/mips/cpu.c b/target/mips/cpu.c
index d72044aef6..9ad1b4177d 100644
--- a/target/mips/cpu.c
+++ b/target/mips/cpu.c
@@ -756,7 +756,7 @@ MIPSCPU *mips_cpu_create_with_clock(const char *cpu_type, Clock *cpu_refclk,
{
DeviceState *cpu;
- cpu = qdev_new(cpu_type);
+ cpu = qdev_new_orphan(cpu_type);
qdev_connect_clock_in(cpu, "clk-in", cpu_refclk);
object_property_set_bool(OBJECT(cpu), "big-endian", is_big_endian,
&error_abort);
diff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c
index 2015a4e3d0..8e888a19d1 100644
--- a/target/xtensa/cpu.c
+++ b/target/xtensa/cpu.c
@@ -288,7 +288,7 @@ XtensaCPU *xtensa_cpu_create_with_clock(const char *cpu_type, Clock *cpu_refclk)
{
DeviceState *cpu;
- cpu = qdev_new(cpu_type);
+ cpu = qdev_new_orphan(cpu_type);
qdev_connect_clock_in(cpu, "clk-in", cpu_refclk);
qdev_realize(cpu, NULL, &error_abort);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 002/134] qdev: Rename qdev_new()/qdev_try_new() to *_orphan()
2026-07-11 22:34 ` [RFC PATCH 002/134] qdev: Rename qdev_new()/qdev_try_new() to *_orphan() Alexander Graf
@ 2026-07-13 8:22 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 156+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-07-13 8:22 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
On 12/7/26 00:34, Alexander Graf wrote:
> qdev_new() creates a device on the heap without a QOM parent. If the
> caller does not add one before realize, device_set_realized() dumps
> the device into /machine/unattached with an unstable canonical path.
>
> We want the short spelling qdev_new() to be the one that gets
> parenting right by construction. As a first step, rename the current
> functions to qdev_new_orphan() and qdev_try_new_orphan() tree-wide so
> that a subsequent commit can reintroduce qdev_new() with a mandatory
> (parent, id, type) signature.
>
> Purely mechanical, generated by
>
> spatch --sp-file scripts/coccinelle/qom-parent/qdev-new-orphan.cocci \
> --in-place --include-headers --dir .
>
> or equivalently
>
> git ls-files '*.[ch]' '*.[ch].inc' '*.rst' '*.py' | \
> grep -v '^subprojects/' | \
> xargs sed -i 's/\bqdev_try_new\b/qdev_try_new_orphan/g;
> s/\bqdev_new\b/qdev_new_orphan/g'
>
> No functional change.
>
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> hw/alpha/typhoon.c | 2 +-
> hw/arm/aspeed.c | 2 +-
> hw/arm/aspeed_soc_common.c | 4 +-
> hw/arm/bananapi_m2u.c | 2 +-
> hw/arm/cubieboard.c | 2 +-
> hw/arm/exynos4210.c | 12 ++--
> hw/arm/imx25_pdk.c | 2 +-
> hw/arm/imx8mm-evk.c | 2 +-
> hw/arm/imx8mp-evk.c | 2 +-
> hw/arm/integratorcp.c | 8 +--
> hw/arm/max78000fthr.c | 2 +-
> hw/arm/mcimx6ul-evk.c | 2 +-
> hw/arm/mcimx7d-sabre.c | 2 +-
> hw/arm/mps2-tz.c | 4 +-
> hw/arm/mps2.c | 4 +-
> hw/arm/msf2-som.c | 4 +-
> hw/arm/musicpal.c | 6 +-
> hw/arm/netduino2.c | 2 +-
> hw/arm/netduinoplus2.c | 2 +-
> hw/arm/npcm7xx_boards.c | 4 +-
> hw/arm/npcm8xx_boards.c | 2 +-
> hw/arm/olimex-stm32-h405.c | 2 +-
> hw/arm/omap1.c | 12 ++--
> hw/arm/orangepi.c | 2 +-
> hw/arm/raspi.c | 2 +-
> hw/arm/realview.c | 18 ++---
> hw/arm/sabrelite.c | 2 +-
> hw/arm/sbsa-ref.c | 20 +++---
> hw/arm/stellaris.c | 20 +++---
> hw/arm/stm32vldiscovery.c | 2 +-
> hw/arm/strongarm.c | 4 +-
> hw/arm/versatilepb.c | 14 ++--
> hw/arm/vexpress.c | 14 ++--
> hw/arm/virt.c | 24 +++----
> hw/arm/xilinx_zynq.c | 26 +++----
> hw/arm/xlnx-versal-virt.c | 2 +-
> hw/arm/xlnx-versal.c | 70 +++++++++----------
> hw/arm/xlnx-zcu102.c | 6 +-
> hw/arm/xlnx-zynqmp.c | 2 +-
> hw/audio/intel-hda.c | 2 +-
> hw/audio/model.c | 2 +-
> hw/avr/atmega.c | 2 +-
> hw/block/fdc-sysbus.c | 4 +-
> hw/block/fdc.c | 2 +-
> hw/block/pflash_cfi01.c | 2 +-
> hw/block/pflash_cfi02.c | 2 +-
> hw/block/xen-block.c | 2 +-
> hw/char/exynos4210_uart.c | 2 +-
> hw/char/mcf_uart.c | 2 +-
> hw/char/mchp_pfsoc_mmuart.c | 2 +-
> hw/char/pl011.c | 2 +-
> hw/char/serial-mm.c | 2 +-
> hw/char/sifive_uart.c | 2 +-
> hw/char/spapr_vty.c | 2 +-
> hw/char/xen_console.c | 2 +-
> hw/core/qdev.c | 4 +-
> hw/core/sysbus.c | 2 +-
> hw/cxl/cxl-host.c | 2 +-
> hw/display/sm501.c | 2 +-
> hw/display/xlnx_dp.c | 4 +-
> hw/dma/rc4030.c | 2 +-
> hw/hexagon/hexagon_dsp.c | 4 +-
> hw/hexagon/virt.c | 6 +-
> hw/hppa/machine.c | 12 ++--
> hw/i2c/core.c | 2 +-
> hw/i2c/smbus_eeprom.c | 2 +-
> hw/i386/microvm.c | 6 +-
> hw/i386/nitro_enclave.c | 4 +-
> hw/i386/pc.c | 2 +-
> hw/i386/pc_piix.c | 2 +-
> hw/i386/pc_q35.c | 2 +-
> hw/i386/pc_sysfw.c | 2 +-
> hw/i386/sgx.c | 2 +-
> hw/i386/x86-common.c | 6 +-
> hw/i3c/core.c | 2 +-
> hw/ide/ide-bus.c | 2 +-
> hw/intc/exynos4210_gic.c | 2 +-
> hw/intc/riscv_aclint.c | 4 +-
> hw/intc/riscv_aplic.c | 2 +-
> hw/intc/riscv_imsic.c | 2 +-
> hw/intc/s390_flic.c | 4 +-
> hw/intc/sifive_plic.c | 2 +-
> hw/isa/isa-bus.c | 6 +-
> hw/loongarch/virt.c | 18 ++---
> hw/m68k/an5206.c | 2 +-
> hw/m68k/mcf_intc.c | 2 +-
> hw/m68k/next-cube.c | 2 +-
> hw/m68k/q800.c | 4 +-
> hw/m68k/virt.c | 10 +--
> hw/mem/sparse-mem.c | 2 +-
> hw/microblaze/petalogix_ml605_mmu.c | 12 ++--
> hw/microblaze/petalogix_s3adsp1800_mmu.c | 8 +--
> hw/mips/boston.c | 4 +-
> hw/mips/jazz.c | 12 ++--
> hw/mips/loongson3_virt.c | 6 +-
> hw/mips/malta.c | 4 +-
> hw/misc/empty_slot.c | 2 +-
> hw/misc/led.c | 2 +-
> hw/misc/sifive_e_prci.c | 2 +-
> hw/misc/sifive_test.c | 2 +-
> hw/net/lan9118.c | 2 +-
> hw/net/smc91c111.c | 2 +-
> hw/net/spapr_llan.c | 2 +-
> hw/net/xen_nic.c | 2 +-
> hw/nitro/machine.c | 4 +-
> hw/nitro/nitro-vsock-bus.c | 2 +-
> hw/nvme/ctrl.c | 2 +-
> hw/nvram/fw_cfg.c | 4 +-
> hw/or1k/or1k-sim.c | 6 +-
> hw/or1k/virt.c | 8 +--
> hw/pci-bridge/pci_expander_bridge.c | 4 +-
> hw/pci-host/astro.c | 2 +-
> hw/pci-host/bonito.c | 2 +-
> hw/pci-host/pnv_phb4_pec.c | 2 +-
> hw/pci/pci.c | 2 +-
> hw/ppc/amigaone.c | 2 +-
> hw/ppc/e500.c | 22 +++---
> hw/ppc/mac_newworld.c | 18 ++---
> hw/ppc/mac_oldworld.c | 8 +--
> hw/ppc/pnv.c | 4 +-
> hw/ppc/pnv_bmc.c | 2 +-
> hw/ppc/ppc440_bamboo.c | 4 +-
> hw/ppc/prep.c | 4 +-
> hw/ppc/sam460ex.c | 16 ++---
> hw/ppc/spapr.c | 4 +-
> hw/ppc/spapr_irq.c | 2 +-
> hw/ppc/spapr_vio.c | 2 +-
> hw/ppc/virtex_ml507.c | 6 +-
> hw/remote/machine.c | 2 +-
> hw/riscv/boston-aia.c | 4 +-
> hw/riscv/microblaze-v-generic.c | 14 ++--
> hw/riscv/microchip_pfsoc.c | 2 +-
> hw/riscv/sifive_u.c | 4 +-
> hw/riscv/virt.c | 8 +--
> hw/rtc/sun4v-rtc.c | 2 +-
> hw/s390x/ap-bridge.c | 2 +-
> hw/s390x/css-bridge.c | 2 +-
> hw/s390x/s390-pci-bus.c | 2 +-
> hw/s390x/s390-virtio-ccw.c | 6 +-
> hw/scsi/lasi_ncr710.c | 2 +-
> hw/scsi/ncr53c710.c | 4 +-
> hw/scsi/scsi-bus.c | 2 +-
> hw/scsi/spapr_vscsi.c | 2 +-
> hw/sh4/r2d.c | 6 +-
> hw/sh4/sh7750.c | 4 +-
> hw/sparc/leon3.c | 10 +--
> hw/sparc/sun4m.c | 38 +++++-----
> hw/sparc64/sun4u.c | 14 ++--
> hw/ssi/ssi.c | 2 +-
> hw/tricore/tricore_testboard.c | 2 +-
> hw/ufs/lu.c | 2 +-
> hw/usb/bus.c | 4 +-
> hw/usb/dev-serial.c | 2 +-
> hw/vmapple/vmapple.c | 20 +++---
> hw/xen/xen-bus.c | 2 +-
> hw/xen/xen-legacy-backend.c | 2 +-
> hw/xen/xen-pvh-common.c | 2 +-
> hw/xtensa/virt.c | 2 +-
> hw/xtensa/xtfpga.c | 2 +-
> include/hw/core/qdev.h | 14 ++--
> include/hw/i2c/i2c.h | 2 +-
> include/hw/misc/unimp.h | 2 +-
> include/hw/ssi/ssi.h | 2 +-
> include/hw/usb/usb.h | 2 +-
> migration/migration.c | 2 +-
> net/net.c | 4 +-
> .../qom-parent/qdev-new-orphan.cocci | 18 +++++
> system/qdev-monitor.c | 2 +-
> target/mips/cpu.c | 2 +-
> target/xtensa/cpu.c | 2 +-
> 170 files changed, 459 insertions(+), 441 deletions(-)
> create mode 100644 scripts/coccinelle/qom-parent/qdev-new-orphan.cocci
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 003/134] qdev: Reintroduce qdev_new() with a mandatory QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
2026-07-11 22:34 ` [RFC PATCH 001/134] qom: Introduce object_new_child() Alexander Graf
2026-07-11 22:34 ` [RFC PATCH 002/134] qdev: Rename qdev_new()/qdev_try_new() to *_orphan() Alexander Graf
@ 2026-07-11 22:34 ` Alexander Graf
2026-07-13 10:55 ` Philippe Mathieu-Daudé
2026-07-11 22:34 ` [RFC PATCH 004/134] sysbus: Make sysbus_create_simple()/_varargs() take a " Alexander Graf
` (131 subsequent siblings)
134 siblings, 1 reply; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:34 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
The previous commit vacated the qdev_new()/qdev_try_new() names.
Reintroduce them with the signature we actually want:
DeviceState *qdev_new(Object *parent, const char *id,
const char *type);
which is the qdev-layer, heap-allocated dual of
object_initialize_child(): the returned device is created and
immediately added to the QOM composition tree as a child of @parent
under @id.
Refcount contract: the initial reference is transferred to the
child<> property of @parent, so on return the caller does not hold a
reference. Pair with qdev_realize() (not qdev_realize_and_unref()),
matching object_initialize_child()'s convention.
qdev_new_orphan() remains for callers that set the parent themselves
before realize (notably qdev_device_add(), which parents under
/machine/peripheral via qdev_set_id()). Later patches convert the
remaining orphan callers subsystem by subsystem.
Suggested-by: Markus Armbruster <armbru@redhat.com>
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/core/qdev.c | 19 +++++++++++++++++++
include/hw/core/qdev.h | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 53 insertions(+)
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 8a8d206a02..d2c89d0310 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -145,6 +145,25 @@ bool qdev_set_parent_bus(DeviceState *dev, BusState *bus, Error **errp)
return true;
}
+DeviceState *qdev_new(Object *parent, const char *id, const char *type)
+{
+ return DEVICE(object_new_child(parent, id, type));
+}
+
+DeviceState *qdev_try_new(Object *parent, const char *id, const char *type)
+{
+ ObjectClass *oc = module_object_class_by_name(type);
+ Object *obj;
+
+ if (!oc) {
+ return NULL;
+ }
+ obj = object_new_with_class(oc);
+ object_property_add_child(parent, id, obj);
+ object_unref(obj);
+ return DEVICE(obj);
+}
+
DeviceState *qdev_new_orphan(const char *name)
{
return DEVICE(object_new(name));
diff --git a/include/hw/core/qdev.h b/include/hw/core/qdev.h
index 839c1b4147..e692a1d48e 100644
--- a/include/hw/core/qdev.h
+++ b/include/hw/core/qdev.h
@@ -406,6 +406,40 @@ struct BusState {
/*** Board API. This should go away once we have a machine config file. ***/
+/**
+ * qdev_new: Create a device and parent it in the QOM composition tree
+ * @parent: the QOM parent (usually the machine or containing device)
+ * @id: child<> property name; the device's canonical QOM path becomes
+ * @parent's path plus "/" plus @id
+ * @type: device type to create (we assert() that this type exists)
+ *
+ * Heap-allocated counterpart to object_initialize_child(). This
+ * allocates and initializes the device state and immediately adds it
+ * as a child of @parent, ready for the caller to set properties and
+ * then realize.
+ *
+ * The reference count of the returned device is 1, held by @parent's
+ * child<> property. The caller therefore does not hold a reference
+ * and pairs this with qdev_realize() (NOT qdev_realize_and_unref()).
+ *
+ * Return: a derived DeviceState, owned by @parent.
+ */
+DeviceState *qdev_new(Object *parent, const char *id, const char *type);
+
+/**
+ * qdev_try_new: Try to create a parented device on the heap
+ * @parent: the QOM parent
+ * @id: child<> property name
+ * @type: device type to create
+ *
+ * This is like qdev_new(), except it returns %NULL when @type does
+ * not exist, rather than asserting.
+ *
+ * Return: a derived DeviceState owned by @parent, or NULL if @type
+ * does not exist.
+ */
+DeviceState *qdev_try_new(Object *parent, const char *id, const char *type);
+
/**
* qdev_new_orphan: Create a device on the heap
* @name: device type to create (we assert() that this type exists)
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 003/134] qdev: Reintroduce qdev_new() with a mandatory QOM parent
2026-07-11 22:34 ` [RFC PATCH 003/134] qdev: Reintroduce qdev_new() with a mandatory QOM parent Alexander Graf
@ 2026-07-13 10:55 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 156+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-07-13 10:55 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
On 12/7/26 00:34, Alexander Graf wrote:
> The previous commit vacated the qdev_new()/qdev_try_new() names.
> Reintroduce them with the signature we actually want:
>
> DeviceState *qdev_new(Object *parent, const char *id,
> const char *type);
>
> which is the qdev-layer, heap-allocated dual of
> object_initialize_child(): the returned device is created and
> immediately added to the QOM composition tree as a child of @parent
> under @id.
>
> Refcount contract: the initial reference is transferred to the
> child<> property of @parent, so on return the caller does not hold a
> reference. Pair with qdev_realize() (not qdev_realize_and_unref()),
> matching object_initialize_child()'s convention.
>
> qdev_new_orphan() remains for callers that set the parent themselves
> before realize (notably qdev_device_add(), which parents under
> /machine/peripheral via qdev_set_id()). Later patches convert the
> remaining orphan callers subsystem by subsystem.
>
> Suggested-by: Markus Armbruster <armbru@redhat.com>
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> hw/core/qdev.c | 19 +++++++++++++++++++
> include/hw/core/qdev.h | 34 ++++++++++++++++++++++++++++++++++
> 2 files changed, 53 insertions(+)
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 004/134] sysbus: Make sysbus_create_simple()/_varargs() take a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (2 preceding siblings ...)
2026-07-11 22:34 ` [RFC PATCH 003/134] qdev: Reintroduce qdev_new() with a mandatory QOM parent Alexander Graf
@ 2026-07-11 22:34 ` Alexander Graf
2026-07-13 10:54 ` Philippe Mathieu-Daudé
2026-07-11 22:34 ` [RFC PATCH 005/134] pci: Make pci_new*()/pci_create_simple*() " Alexander Graf
` (130 subsequent siblings)
134 siblings, 1 reply; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:34 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Sysbus is by far the largest producer of orphaned onboard devices:
of the ~1180 unparented device creation sites in the tree, well over
half go through sysbus_create_simple(), sysbus_create_varargs(), or
qdev_new_orphan()+sysbus_realize_and_unref() open-coded.
Apply the same rename-and-reintroduce treatment as qdev_new():
mechanically rename the existing helpers to *_orphan() and
reintroduce the short names with a leading (parent, id, ...) pair
that plumbs down to the new qdev_new(). The parented versions call
sysbus_realize() (not _and_unref) since the child<> property already
holds the sole reference.
The mechanical rename part is generated by
spatch --sp-file \
scripts/coccinelle/qom-parent/sysbus-create-orphan.cocci \
--in-place --include-headers --dir .
or equivalently
git ls-files '*.[ch]' '*.[ch].inc' '*.rst' '*.py' | \
grep -v '^subprojects/' | \
xargs sed -i \
's/\bsysbus_create_simple\b/sysbus_create_simple_orphan/g;
s/\bsysbus_create_varargs\b/sysbus_create_varargs_orphan/g'
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/allwinner-h3.c | 16 ++++-----
hw/arm/collie.c | 2 +-
hw/arm/exynos4210.c | 14 ++++----
hw/arm/fsl-imx6.c | 2 +-
hw/arm/integratorcp.c | 18 +++++-----
hw/arm/mps2.c | 6 ++--
hw/arm/musicpal.c | 18 +++++-----
hw/arm/npcm7xx.c | 2 +-
hw/arm/realview.c | 24 ++++++-------
hw/arm/sbsa-ref.c | 6 ++--
hw/arm/stellaris.c | 8 ++---
hw/arm/strongarm.c | 10 +++---
hw/arm/versatilepb.c | 28 +++++++--------
hw/arm/vexpress.c | 20 +++++------
hw/arm/virt.c | 8 ++---
hw/arm/xilinx_zynq.c | 10 +++---
hw/core/sysbus.c | 35 ++++++++++++++++++-
hw/i386/kvm/clock.c | 2 +-
hw/i386/kvm/xen_evtchn.c | 2 +-
hw/i386/kvm/xen_gnttab.c | 2 +-
hw/i386/kvm/xen_overlay.c | 2 +-
hw/i386/kvm/xen_primary_console.c | 2 +-
hw/i386/kvm/xen_xenstore.c | 2 +-
hw/i386/microvm.c | 2 +-
hw/intc/apic_common.c | 2 +-
hw/loongarch/virt.c | 2 +-
hw/m68k/next-cube.c | 4 +--
hw/m68k/virt.c | 2 +-
hw/mips/jazz.c | 2 +-
hw/mips/loongson3_virt.c | 2 +-
hw/or1k/virt.c | 2 +-
hw/ppc/amigaone.c | 2 +-
hw/ppc/e500.c | 2 +-
hw/ppc/pegasos.c | 4 +--
hw/ppc/ppc440_bamboo.c | 2 +-
hw/ppc/sam460ex.c | 8 ++---
hw/riscv/virt.c | 4 +--
hw/sparc/sun4m.c | 2 +-
hw/vmapple/vmapple.c | 4 +--
hw/xen/xen-pvh-common.c | 2 +-
include/hw/core/sysbus.h | 32 ++++++++++++++---
.../qom-parent/sysbus-create-orphan.cocci | 18 ++++++++++
42 files changed, 206 insertions(+), 131 deletions(-)
create mode 100644 scripts/coccinelle/qom-parent/sysbus-create-orphan.cocci
diff --git a/hw/arm/allwinner-h3.c b/hw/arm/allwinner-h3.c
index 262e99b3f9..427dbad7c3 100644
--- a/hw/arm/allwinner-h3.c
+++ b/hw/arm/allwinner-h3.c
@@ -379,29 +379,29 @@ static void allwinner_h3_realize(DeviceState *dev, Error **errp)
qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_EMAC));
/* Universal Serial Bus */
- sysbus_create_simple(TYPE_AW_H3_EHCI, s->memmap[AW_H3_DEV_EHCI0],
+ sysbus_create_simple_orphan(TYPE_AW_H3_EHCI, s->memmap[AW_H3_DEV_EHCI0],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_EHCI0));
- sysbus_create_simple(TYPE_AW_H3_EHCI, s->memmap[AW_H3_DEV_EHCI1],
+ sysbus_create_simple_orphan(TYPE_AW_H3_EHCI, s->memmap[AW_H3_DEV_EHCI1],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_EHCI1));
- sysbus_create_simple(TYPE_AW_H3_EHCI, s->memmap[AW_H3_DEV_EHCI2],
+ sysbus_create_simple_orphan(TYPE_AW_H3_EHCI, s->memmap[AW_H3_DEV_EHCI2],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_EHCI2));
- sysbus_create_simple(TYPE_AW_H3_EHCI, s->memmap[AW_H3_DEV_EHCI3],
+ sysbus_create_simple_orphan(TYPE_AW_H3_EHCI, s->memmap[AW_H3_DEV_EHCI3],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_EHCI3));
- sysbus_create_simple("sysbus-ohci", s->memmap[AW_H3_DEV_OHCI0],
+ sysbus_create_simple_orphan("sysbus-ohci", s->memmap[AW_H3_DEV_OHCI0],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_OHCI0));
- sysbus_create_simple("sysbus-ohci", s->memmap[AW_H3_DEV_OHCI1],
+ sysbus_create_simple_orphan("sysbus-ohci", s->memmap[AW_H3_DEV_OHCI1],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_OHCI1));
- sysbus_create_simple("sysbus-ohci", s->memmap[AW_H3_DEV_OHCI2],
+ sysbus_create_simple_orphan("sysbus-ohci", s->memmap[AW_H3_DEV_OHCI2],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_OHCI2));
- sysbus_create_simple("sysbus-ohci", s->memmap[AW_H3_DEV_OHCI3],
+ sysbus_create_simple_orphan("sysbus-ohci", s->memmap[AW_H3_DEV_OHCI3],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_OHCI3));
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
index 91f0a94b6f..81bc019460 100644
--- a/hw/arm/collie.c
+++ b/hw/arm/collie.c
@@ -64,7 +64,7 @@ static void collie_init(MachineState *machine)
FLASH_SECTOR_SIZE, 4, 0x00, 0x00, 0x00, 0x00, 0);
}
- sysbus_create_simple("scoop", 0x40800000, NULL);
+ sysbus_create_simple_orphan("scoop", 0x40800000, NULL);
collie_binfo.board_id = 0x208;
arm_load_kernel(cms->sa1110->cpu, machine, &collie_binfo);
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
index 2b6e61abd0..3199ea9cb7 100644
--- a/hw/arm/exynos4210.c
+++ b/hw/arm/exynos4210.c
@@ -600,7 +600,7 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
}
/* Cache controller */
- sysbus_create_simple("l2x0", EXYNOS4210_L2X0_BASE_ADDR, NULL);
+ sysbus_create_simple_orphan("l2x0", EXYNOS4210_L2X0_BASE_ADDR, NULL);
/* External GIC */
qdev_prop_set_uint32(DEVICE(&s->ext_gic), "num-cpu", EXYNOS4210_NCPUS);
@@ -667,13 +667,13 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
* The only reason of existence at the moment is that secondary CPU boot
* loader uses PMU INFORM5 register as a holding pen.
*/
- sysbus_create_simple("exynos4210.pmu", EXYNOS4210_PMU_BASE_ADDR, NULL);
+ sysbus_create_simple_orphan("exynos4210.pmu", EXYNOS4210_PMU_BASE_ADDR, NULL);
- sysbus_create_simple("exynos4210.clk", EXYNOS4210_CLK_BASE_ADDR, NULL);
- sysbus_create_simple("exynos4210.rng", EXYNOS4210_RNG_BASE_ADDR, NULL);
+ sysbus_create_simple_orphan("exynos4210.clk", EXYNOS4210_CLK_BASE_ADDR, NULL);
+ sysbus_create_simple_orphan("exynos4210.rng", EXYNOS4210_RNG_BASE_ADDR, NULL);
/* PWM */
- sysbus_create_varargs("exynos4210.pwm", EXYNOS4210_PWM_BASE_ADDR,
+ sysbus_create_varargs_orphan("exynos4210.pwm", EXYNOS4210_PWM_BASE_ADDR,
s->irq_table[exynos4210_get_irq(22, 0)],
s->irq_table[exynos4210_get_irq(22, 1)],
s->irq_table[exynos4210_get_irq(22, 2)],
@@ -681,7 +681,7 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
s->irq_table[exynos4210_get_irq(22, 4)],
NULL);
/* RTC */
- sysbus_create_varargs("exynos4210.rtc", EXYNOS4210_RTC_BASE_ADDR,
+ sysbus_create_varargs_orphan("exynos4210.rtc", EXYNOS4210_RTC_BASE_ADDR,
s->irq_table[exynos4210_get_irq(23, 0)],
s->irq_table[exynos4210_get_irq(23, 1)],
NULL);
@@ -784,7 +784,7 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
sysbus_connect_irq(busdev, n, s->irq_table[exynos4210_get_irq(11, n)]);
}
- sysbus_create_simple(TYPE_EXYNOS4210_EHCI, EXYNOS4210_EHCI_BASE_ADDR,
+ sysbus_create_simple_orphan(TYPE_EXYNOS4210_EHCI, EXYNOS4210_EHCI_BASE_ADDR,
s->irq_table[exynos4210_get_irq(28, 3)]);
/*** DMA controllers ***/
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index eec9673c6f..103adcc2bd 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -168,7 +168,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
}
/* L2 cache controller */
- sysbus_create_simple("l2x0", FSL_IMX6_PL310_ADDR, NULL);
+ sysbus_create_simple_orphan("l2x0", FSL_IMX6_PL310_ADDR, NULL);
if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
return;
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 8a56165cc2..3df488921a 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -626,26 +626,26 @@ static void integratorcp_init(MachineState *machine)
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map((SysBusDevice *)dev, 0, 0x10000000);
- dev = sysbus_create_varargs(TYPE_INTEGRATOR_PIC, 0x14000000,
+ dev = sysbus_create_varargs_orphan(TYPE_INTEGRATOR_PIC, 0x14000000,
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ),
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_FIQ),
NULL);
for (i = 0; i < 32; i++) {
pic[i] = qdev_get_gpio_in(dev, i);
}
- sic = sysbus_create_simple(TYPE_INTEGRATOR_PIC, 0xca000000, pic[26]);
- sysbus_create_varargs("integrator_pit", 0x13000000,
+ sic = sysbus_create_simple_orphan(TYPE_INTEGRATOR_PIC, 0xca000000, pic[26]);
+ sysbus_create_varargs_orphan("integrator_pit", 0x13000000,
pic[5], pic[6], pic[7], NULL);
- sysbus_create_simple("pl031", 0x15000000, pic[8]);
+ sysbus_create_simple_orphan("pl031", 0x15000000, pic[8]);
pl011_create(0x16000000, pic[1], serial_hd(0));
pl011_create(0x17000000, pic[2], serial_hd(1));
- icp = sysbus_create_simple(TYPE_ICP_CONTROL_REGS, 0xcb000000,
+ icp = sysbus_create_simple_orphan(TYPE_ICP_CONTROL_REGS, 0xcb000000,
qdev_get_gpio_in(sic, 3));
- sysbus_create_simple("pl050_keyboard", 0x18000000, pic[3]);
- sysbus_create_simple("pl050_mouse", 0x19000000, pic[4]);
- sysbus_create_simple(TYPE_INTEGRATOR_DEBUG, 0x1a000000, 0);
+ sysbus_create_simple_orphan("pl050_keyboard", 0x18000000, pic[3]);
+ sysbus_create_simple_orphan("pl050_mouse", 0x19000000, pic[4]);
+ sysbus_create_simple_orphan(TYPE_INTEGRATOR_DEBUG, 0x1a000000, 0);
- dev = sysbus_create_varargs("pl181", 0x1c000000, pic[23], pic[24], NULL);
+ dev = sysbus_create_varargs_orphan("pl181", 0x1c000000, pic[23], pic[24], NULL);
qdev_connect_gpio_out_named(dev, "card-read-only", 0,
qdev_get_gpio_in_named(icp, ICP_GPIO_MMC_WPROT, 0));
qdev_connect_gpio_out_named(dev, "card-inserted", 0,
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
index 96af49e213..5a0384a412 100644
--- a/hw/arm/mps2.c
+++ b/hw/arm/mps2.c
@@ -416,7 +416,7 @@ static void mps2_common_init(MachineState *machine)
qdev_prop_set_uint32(DEVICE(&mms->fpgaio), "prescale-clk", 25000000);
sysbus_realize(SYS_BUS_DEVICE(&mms->fpgaio), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(&mms->fpgaio), 0, 0x40028000);
- sysbus_create_simple(TYPE_PL022, 0x40025000, /* External ADC */
+ sysbus_create_simple_orphan(TYPE_PL022, 0x40025000, /* External ADC */
qdev_get_gpio_in(armv7m, 22));
for (i = 0; i < 2; i++) {
static const int spi_irqno[] = {11, 24};
@@ -435,7 +435,7 @@ static void mps2_common_init(MachineState *machine)
qdev_connect_gpio_out(orgate_dev, 0,
qdev_get_gpio_in(armv7m, spi_irqno[i]));
for (j = 0; j < 2; j++) {
- sysbus_create_simple(TYPE_PL022, spibase[2 * i + j],
+ sysbus_create_simple_orphan(TYPE_PL022, spibase[2 * i + j],
qdev_get_gpio_in(orgate_dev, j));
}
}
@@ -446,7 +446,7 @@ static void mps2_common_init(MachineState *machine)
0x4002a000}; /* Shield1 */
DeviceState *dev;
- dev = sysbus_create_simple(TYPE_ARM_SBCON_I2C, i2cbase[i], NULL);
+ dev = sysbus_create_simple_orphan(TYPE_ARM_SBCON_I2C, i2cbase[i], NULL);
if (i < 2) {
/*
* internal-only bus: mark it full to avoid user-created
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index 6dd18a67b2..3bcdea7db8 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1240,9 +1240,9 @@ static void musicpal_init(MachineState *machine)
&error_fatal);
memory_region_add_subregion(address_space_mem, MP_SRAM_BASE, sram);
- pic = sysbus_create_simple(TYPE_MV88W8618_PIC, MP_PIC_BASE,
+ pic = sysbus_create_simple_orphan(TYPE_MV88W8618_PIC, MP_PIC_BASE,
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ));
- sysbus_create_varargs(TYPE_MV88W8618_PIT, MP_PIT_BASE,
+ sysbus_create_varargs_orphan(TYPE_MV88W8618_PIT, MP_PIT_BASE,
qdev_get_gpio_in(pic, MP_TIMER1_IRQ),
qdev_get_gpio_in(pic, MP_TIMER2_IRQ),
qdev_get_gpio_in(pic, MP_TIMER3_IRQ),
@@ -1286,7 +1286,7 @@ static void musicpal_init(MachineState *machine)
2, 0x00BF, 0x236D, 0x0000, 0x0000,
0x5555, 0x2AAA, 0);
}
- sysbus_create_simple(TYPE_MV88W8618_FLASHCFG, MP_FLASHCFG_BASE, NULL);
+ sysbus_create_simple_orphan(TYPE_MV88W8618_FLASHCFG, MP_FLASHCFG_BASE, NULL);
dev = qdev_new_orphan(TYPE_MV88W8618_ETH);
qemu_configure_nic_device(dev, true, "mv88w8618");
@@ -1297,17 +1297,17 @@ static void musicpal_init(MachineState *machine)
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
qdev_get_gpio_in(pic, MP_ETH_IRQ));
- sysbus_create_simple("mv88w8618_wlan", MP_WLAN_BASE, NULL);
+ sysbus_create_simple_orphan("mv88w8618_wlan", MP_WLAN_BASE, NULL);
- sysbus_create_simple(TYPE_MUSICPAL_MISC, MP_MISC_BASE, NULL);
+ sysbus_create_simple_orphan(TYPE_MUSICPAL_MISC, MP_MISC_BASE, NULL);
- dev = sysbus_create_simple(TYPE_MUSICPAL_GPIO, MP_GPIO_BASE,
+ dev = sysbus_create_simple_orphan(TYPE_MUSICPAL_GPIO, MP_GPIO_BASE,
qdev_get_gpio_in(pic, MP_GPIO_IRQ));
- i2c_dev = sysbus_create_simple(TYPE_GPIO_I2C, -1, NULL);
+ i2c_dev = sysbus_create_simple_orphan(TYPE_GPIO_I2C, -1, NULL);
i2c = (I2CBus *)qdev_get_child_bus(i2c_dev, "i2c");
- lcd_dev = sysbus_create_simple(TYPE_MUSICPAL_LCD, MP_LCD_BASE, NULL);
- key_dev = sysbus_create_simple(TYPE_MUSICPAL_KEY, -1, NULL);
+ lcd_dev = sysbus_create_simple_orphan(TYPE_MUSICPAL_LCD, MP_LCD_BASE, NULL);
+ key_dev = sysbus_create_simple_orphan(TYPE_MUSICPAL_KEY, -1, NULL);
/* I2C read data */
qdev_connect_gpio_out(i2c_dev, 0,
diff --git a/hw/arm/npcm7xx.c b/hw/arm/npcm7xx.c
index c27f149c04..87734c1cfb 100644
--- a/hw/arm/npcm7xx.c
+++ b/hw/arm/npcm7xx.c
@@ -521,7 +521,7 @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
}
/* L2 cache controller */
- sysbus_create_simple("l2x0", NPCM7XX_L2C_BA, NULL);
+ sysbus_create_simple_orphan("l2x0", NPCM7XX_L2C_BA, NULL);
/* System Global Control Registers (GCR). Can fail due to user input. */
object_property_set_int(OBJECT(&s->gcr), "disabled-modules",
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index 0fce9b624f..287c092c2d 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -200,13 +200,13 @@ static void realview_init(MachineState *machine,
for (n = 0; n < smp_cpus; n++) {
sysbus_connect_irq(busdev, n, cpu_irq[n]);
}
- sysbus_create_varargs("l2x0", periphbase + 0x2000, NULL);
+ sysbus_create_varargs_orphan("l2x0", periphbase + 0x2000, NULL);
/* Both A9 and 11MPCore put the GIC CPU i/f at base + 0x100 */
realview_binfo.gic_cpu_if_addr = periphbase + 0x100;
} else {
uint32_t gic_addr = is_pb ? 0x1e000000 : 0x10040000;
/* For now just create the nIRQ GIC, and ignore the others. */
- dev = sysbus_create_simple(TYPE_REALVIEW_GIC, gic_addr, cpu_irq[0]);
+ dev = sysbus_create_simple_orphan(TYPE_REALVIEW_GIC, gic_addr, cpu_irq[0]);
}
for (n = 0; n < GIC_EXT_IRQS; n++) {
pic[n] = qdev_get_gpio_in(dev, n);
@@ -221,8 +221,8 @@ static void realview_init(MachineState *machine,
sysbus_mmio_map(SYS_BUS_DEVICE(pl041), 0, 0x10004000);
sysbus_connect_irq(SYS_BUS_DEVICE(pl041), 0, pic[19]);
- sysbus_create_simple("pl050_keyboard", 0x10006000, pic[20]);
- sysbus_create_simple("pl050_mouse", 0x10007000, pic[21]);
+ sysbus_create_simple_orphan("pl050_keyboard", 0x10006000, pic[20]);
+ sysbus_create_simple_orphan("pl050_mouse", 0x10007000, pic[21]);
pl011_create(0x10009000, pic[12], serial_hd(0));
pl011_create(0x1000a000, pic[13], serial_hd(1));
@@ -238,12 +238,12 @@ static void realview_init(MachineState *machine,
sysbus_mmio_map(busdev, 0, 0x10030000);
sysbus_connect_irq(busdev, 0, pic[24]);
- sysbus_create_simple("sp804", 0x10011000, pic[4]);
- sysbus_create_simple("sp804", 0x10012000, pic[5]);
+ sysbus_create_simple_orphan("sp804", 0x10011000, pic[4]);
+ sysbus_create_simple_orphan("sp804", 0x10012000, pic[5]);
- sysbus_create_simple("pl061", 0x10013000, pic[6]);
- sysbus_create_simple("pl061", 0x10014000, pic[7]);
- gpio2 = sysbus_create_simple("pl061", 0x10015000, pic[8]);
+ sysbus_create_simple_orphan("pl061", 0x10013000, pic[6]);
+ sysbus_create_simple_orphan("pl061", 0x10014000, pic[7]);
+ gpio2 = sysbus_create_simple_orphan("pl061", 0x10015000, pic[8]);
dev = qdev_new_orphan("pl111");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
@@ -252,7 +252,7 @@ static void realview_init(MachineState *machine,
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x10020000);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[23]);
- dev = sysbus_create_varargs("pl181", 0x10005000, pic[17], pic[18], NULL);
+ dev = sysbus_create_varargs_orphan("pl181", 0x10005000, pic[17], pic[18], NULL);
/* Wire up MMC card detect and read-only signals. These have
* to go to both the PL061 GPIO and the sysctl register.
* Note that the PL181 orders these lines (readonly,inserted)
@@ -278,7 +278,7 @@ static void realview_init(MachineState *machine,
&error_fatal);
}
- sysbus_create_simple("pl031", 0x10017000, pic[10]);
+ sysbus_create_simple_orphan("pl031", 0x10017000, pic[10]);
if (!is_pb) {
dev = qdev_new_orphan("realview_pci");
@@ -319,7 +319,7 @@ static void realview_init(MachineState *machine,
pci_init_nic_devices(pci_bus, "rtl8139");
}
- dev = sysbus_create_simple(TYPE_ARM_SBCON_I2C, 0x10002000, NULL);
+ dev = sysbus_create_simple_orphan(TYPE_ARM_SBCON_I2C, 0x10002000, NULL);
i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
i2c_slave_create_simple(i2c, "ds1338", 0x68);
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
index 47a1a82a39..a821833fa7 100644
--- a/hw/arm/sbsa-ref.c
+++ b/hw/arm/sbsa-ref.c
@@ -537,7 +537,7 @@ static void create_rtc(const SBSAMachineState *sms)
hwaddr base = sbsa_ref_memmap[SBSA_RTC].base;
int irq = sbsa_ref_irqmap[SBSA_RTC];
- sysbus_create_simple("pl031", base, qdev_get_gpio_in(sms->gic, irq));
+ sysbus_create_simple_orphan("pl031", base, qdev_get_gpio_in(sms->gic, irq));
}
static void create_wdt(const SBSAMachineState *sms)
@@ -572,10 +572,10 @@ static void create_gpio(const SBSAMachineState *sms)
hwaddr base = sbsa_ref_memmap[SBSA_GPIO].base;
int irq = sbsa_ref_irqmap[SBSA_GPIO];
- pl061_dev = sysbus_create_simple("pl061", base,
+ pl061_dev = sysbus_create_simple_orphan("pl061", base,
qdev_get_gpio_in(sms->gic, irq));
- gpio_key_dev = sysbus_create_simple("gpio-key", -1,
+ gpio_key_dev = sysbus_create_simple_orphan("gpio-key", -1,
qdev_get_gpio_in(pl061_dev, 3));
/* connect powerdown request */
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index 1f816a3965..3f72cedf2e 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1143,7 +1143,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
sysbus_connect_irq(SYS_BUS_DEVICE(ssys_dev), 0, qdev_get_gpio_in(nvic, 28));
if (DEV_CAP(1, ADC)) {
- dev = sysbus_create_varargs(TYPE_STELLARIS_ADC, 0x40038000,
+ dev = sysbus_create_varargs_orphan(TYPE_STELLARIS_ADC, 0x40038000,
qdev_get_gpio_in(nvic, 14),
qdev_get_gpio_in(nvic, 15),
qdev_get_gpio_in(nvic, 16),
@@ -1189,7 +1189,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
for (i = 0; i < NUM_GPIO; i++) {
if (DEV_CAP(4, GPIO(i))) {
- gpio_dev[i] = sysbus_create_simple("pl061_luminary", gpio_addr[i],
+ gpio_dev[i] = sysbus_create_simple_orphan("pl061_luminary", gpio_addr[i],
qdev_get_gpio_in(nvic,
gpio_irq[i]));
for (j = 0; j < 8; j++) {
@@ -1201,7 +1201,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
for (i = 0; i < NUM_I2C; i++) {
if (DEV_CAP(2, I2C(i))) {
- i2c_dev[i] = sysbus_create_simple(TYPE_STELLARIS_I2C, i2c_addr[i],
+ i2c_dev[i] = sysbus_create_simple_orphan(TYPE_STELLARIS_I2C, i2c_addr[i],
qdev_get_gpio_in(nvic,
i2c_irq[i]));
}
@@ -1226,7 +1226,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
}
}
if (DEV_CAP(2, SSI)) {
- dev = sysbus_create_simple("pl022", 0x40008000,
+ dev = sysbus_create_simple_orphan("pl022", 0x40008000,
qdev_get_gpio_in(nvic, 7));
if (board->peripherals & BP_OLED_SSI) {
void *bus;
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
index 0c6b04f805..f67aaa23ed 100644
--- a/hw/arm/strongarm.c
+++ b/hw/arm/strongarm.c
@@ -1622,24 +1622,24 @@ StrongARMState *sa1110_init(const char *cpu_type)
s->cpu = ARM_CPU(cpu_create(cpu_type));
- s->pic = sysbus_create_varargs("strongarm_pic", 0x90050000,
+ s->pic = sysbus_create_varargs_orphan("strongarm_pic", 0x90050000,
qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_IRQ),
qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_FIQ),
NULL);
- sysbus_create_varargs("pxa25x-timer", 0x90000000,
+ sysbus_create_varargs_orphan("pxa25x-timer", 0x90000000,
qdev_get_gpio_in(s->pic, SA_PIC_OSTC0),
qdev_get_gpio_in(s->pic, SA_PIC_OSTC1),
qdev_get_gpio_in(s->pic, SA_PIC_OSTC2),
qdev_get_gpio_in(s->pic, SA_PIC_OSTC3),
NULL);
- sysbus_create_simple(TYPE_STRONGARM_RTC, 0x90010000,
+ sysbus_create_simple_orphan(TYPE_STRONGARM_RTC, 0x90010000,
qdev_get_gpio_in(s->pic, SA_PIC_RTC_ALARM));
s->gpio = strongarm_gpio_init(0x90040000, s->pic);
- s->ppc = sysbus_create_varargs(TYPE_STRONGARM_PPC, 0x90060000, NULL);
+ s->ppc = sysbus_create_varargs_orphan(TYPE_STRONGARM_PPC, 0x90060000, NULL);
for (i = 0; sa_serial[i].io_base; i++) {
DeviceState *dev = qdev_new_orphan(TYPE_STRONGARM_UART);
@@ -1651,7 +1651,7 @@ StrongARMState *sa1110_init(const char *cpu_type)
qdev_get_gpio_in(s->pic, sa_serial[i].irq));
}
- s->ssp = sysbus_create_varargs(TYPE_STRONGARM_SSP, 0x80070000,
+ s->ssp = sysbus_create_varargs_orphan(TYPE_STRONGARM_SSP, 0x80070000,
qdev_get_gpio_in(s->pic, SA_PIC_SSP), NULL);
s->ssp_bus = (SSIBus *)qdev_get_child_bus(s->ssp, "ssi");
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index 5e9d76859f..b80410db0d 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -232,21 +232,21 @@ static void versatile_init(MachineState *machine, int board_id)
sysbus_realize_and_unref(SYS_BUS_DEVICE(sysctl), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(sysctl), 0, 0x10000000);
- dev = sysbus_create_varargs("pl190", 0x10140000,
+ dev = sysbus_create_varargs_orphan("pl190", 0x10140000,
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ),
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_FIQ),
NULL);
for (n = 0; n < 32; n++) {
pic[n] = qdev_get_gpio_in(dev, n);
}
- dev = sysbus_create_simple(TYPE_VERSATILE_PB_SIC, 0x10003000, NULL);
+ dev = sysbus_create_simple_orphan(TYPE_VERSATILE_PB_SIC, 0x10003000, NULL);
for (n = 0; n < 32; n++) {
sysbus_connect_irq(SYS_BUS_DEVICE(dev), n, pic[n]);
sic[n] = qdev_get_gpio_in(dev, n);
}
- sysbus_create_simple("pl050_keyboard", 0x10006000, sic[3]);
- sysbus_create_simple("pl050_mouse", 0x10007000, sic[4]);
+ sysbus_create_simple_orphan("pl050_keyboard", 0x10006000, sic[3]);
+ sysbus_create_simple_orphan("pl050_mouse", 0x10007000, sic[4]);
dev = qdev_new_orphan("versatile_pci");
busdev = SYS_BUS_DEVICE(dev);
@@ -292,13 +292,13 @@ static void versatile_init(MachineState *machine, int board_id)
sysbus_mmio_map(busdev, 0, 0x10130000);
sysbus_connect_irq(busdev, 0, pic[17]);
- sysbus_create_simple("sp804", 0x101e2000, pic[4]);
- sysbus_create_simple("sp804", 0x101e3000, pic[5]);
+ sysbus_create_simple_orphan("sp804", 0x101e2000, pic[4]);
+ sysbus_create_simple_orphan("sp804", 0x101e3000, pic[5]);
- sysbus_create_simple("pl061", 0x101e4000, pic[6]);
- sysbus_create_simple("pl061", 0x101e5000, pic[7]);
- sysbus_create_simple("pl061", 0x101e6000, pic[8]);
- sysbus_create_simple("pl061", 0x101e7000, pic[9]);
+ sysbus_create_simple_orphan("pl061", 0x101e4000, pic[6]);
+ sysbus_create_simple_orphan("pl061", 0x101e5000, pic[7]);
+ sysbus_create_simple_orphan("pl061", 0x101e6000, pic[8]);
+ sysbus_create_simple_orphan("pl061", 0x101e7000, pic[9]);
/* The versatile/PB actually has a modified Color LCD controller
that includes hardware cursor support from the PL111. */
@@ -312,7 +312,7 @@ static void versatile_init(MachineState *machine, int board_id)
/* Wire up the mux control signals from the SYS_CLCD register */
qdev_connect_gpio_out(sysctl, 0, qdev_get_gpio_in(dev, 0));
- dev = sysbus_create_varargs("pl181", 0x10005000, sic[22], sic[1], NULL);
+ dev = sysbus_create_varargs_orphan("pl181", 0x10005000, sic[22], sic[1], NULL);
dinfo = drive_get(IF_SD, 0, 0);
if (dinfo) {
DeviceState *card;
@@ -324,7 +324,7 @@ static void versatile_init(MachineState *machine, int board_id)
&error_fatal);
}
- dev = sysbus_create_varargs("pl181", 0x1000b000, sic[23], sic[2], NULL);
+ dev = sysbus_create_varargs_orphan("pl181", 0x1000b000, sic[23], sic[2], NULL);
dinfo = drive_get(IF_SD, 0, 1);
if (dinfo) {
DeviceState *card;
@@ -337,9 +337,9 @@ static void versatile_init(MachineState *machine, int board_id)
}
/* Add PL031 Real Time Clock. */
- sysbus_create_simple("pl031", 0x101e8000, pic[10]);
+ sysbus_create_simple_orphan("pl031", 0x101e8000, pic[10]);
- dev = sysbus_create_simple(TYPE_ARM_SBCON_I2C, 0x10002000, NULL);
+ dev = sysbus_create_simple_orphan(TYPE_ARM_SBCON_I2C, 0x10002000, NULL);
i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
i2c_slave_create_simple(i2c, "ds1338", 0x68);
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index 716f55a086..5a0012cb4f 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -313,7 +313,7 @@ static void a9_daughterboard_init(VexpressMachineState *vms,
/* 0x100e1000 PL354 Static Memory Controller */
/* 0x100e2000 System Configuration Controller */
- sysbus_create_simple("sp804", 0x100e4000, pic[48]);
+ sysbus_create_simple_orphan("sp804", 0x100e4000, pic[48]);
/* 0x100e5000 SP805 Watchdog module */
/* 0x100e6000 BP147 TrustZone Protection Controller */
/* 0x100e9000 PL301 'Fast' AXI matrix */
@@ -321,7 +321,7 @@ static void a9_daughterboard_init(VexpressMachineState *vms,
/* 0x100ec000 TrustZone Address Space Controller */
/* 0x10200000 CoreSight debug APB */
/* 0x1e00a000 PL310 L2 Cache Controller */
- sysbus_create_varargs("l2x0", 0x1e00a000, NULL);
+ sysbus_create_varargs_orphan("l2x0", 0x1e00a000, NULL);
}
/* Voltage values for SYS_CFG_VOLT daughterboard registers;
@@ -623,7 +623,7 @@ static void vexpress_common_init(MachineState *machine)
sysbus_mmio_map(SYS_BUS_DEVICE(pl041), 0, map[VE_PL041]);
sysbus_connect_irq(SYS_BUS_DEVICE(pl041), 0, pic[11]);
- dev = sysbus_create_varargs("pl181", map[VE_MMCI], pic[9], pic[10], NULL);
+ dev = sysbus_create_varargs_orphan("pl181", map[VE_MMCI], pic[9], pic[10], NULL);
/* Wire up MMC card detect and read-only signals */
qdev_connect_gpio_out_named(dev, "card-read-only", 0,
qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_WPROT));
@@ -640,22 +640,22 @@ static void vexpress_common_init(MachineState *machine)
&error_fatal);
}
- sysbus_create_simple("pl050_keyboard", map[VE_KMI0], pic[12]);
- sysbus_create_simple("pl050_mouse", map[VE_KMI1], pic[13]);
+ sysbus_create_simple_orphan("pl050_keyboard", map[VE_KMI0], pic[12]);
+ sysbus_create_simple_orphan("pl050_mouse", map[VE_KMI1], pic[13]);
pl011_create(map[VE_UART0], pic[5], serial_hd(0));
pl011_create(map[VE_UART1], pic[6], serial_hd(1));
pl011_create(map[VE_UART2], pic[7], serial_hd(2));
pl011_create(map[VE_UART3], pic[8], serial_hd(3));
- sysbus_create_simple("sp804", map[VE_TIMER01], pic[2]);
- sysbus_create_simple("sp804", map[VE_TIMER23], pic[3]);
+ sysbus_create_simple_orphan("sp804", map[VE_TIMER01], pic[2]);
+ sysbus_create_simple_orphan("sp804", map[VE_TIMER23], pic[3]);
- dev = sysbus_create_simple(TYPE_ARM_SBCON_I2C, map[VE_SERIALDVI], NULL);
+ dev = sysbus_create_simple_orphan(TYPE_ARM_SBCON_I2C, map[VE_SERIALDVI], NULL);
i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
i2c_slave_create_simple(i2c, "sii9022", 0x39);
- sysbus_create_simple("pl031", map[VE_RTC], pic[4]); /* RTC */
+ sysbus_create_simple_orphan("pl031", map[VE_RTC], pic[4]); /* RTC */
/* VE_COMPACTFLASH: not modelled */
@@ -706,7 +706,7 @@ static void vexpress_common_init(MachineState *machine)
* no backend is created the transport will just sit harmlessly idle.
*/
for (i = 0; i < NUM_VIRTIO_TRANSPORTS; i++) {
- sysbus_create_simple("virtio-mmio", map[VE_VIRTIO] + 0x200 * i,
+ sysbus_create_simple_orphan("virtio-mmio", map[VE_VIRTIO] + 0x200 * i,
pic[40 + i]);
}
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 3f62c8fc2d..686dde5996 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1561,7 +1561,7 @@ static void create_rtc(const VirtMachineState *vms)
const char compat[] = "arm,pl031\0arm,primecell";
MachineState *ms = MACHINE(vms);
- sysbus_create_simple("pl031", base, qdev_get_gpio_in(vms->gic, irq));
+ sysbus_create_simple_orphan("pl031", base, qdev_get_gpio_in(vms->gic, irq));
nodename = g_strdup_printf("/pl031@%" PRIx64, base);
qemu_fdt_add_subnode(ms->fdt, nodename);
@@ -1606,7 +1606,7 @@ static void virt_generic_error_req(Notifier *n, void *opaque)
static void create_gpio_keys(char *fdt, DeviceState *pl061_dev,
uint32_t phandle)
{
- gpio_key_dev = sysbus_create_simple("gpio-key", -1,
+ gpio_key_dev = sysbus_create_simple_orphan("gpio-key", -1,
qdev_get_gpio_in(pl061_dev,
GPIO_PIN_POWER_BUTTON));
@@ -1631,7 +1631,7 @@ static void create_secure_gpio_pwr(char *fdt, DeviceState *pl061_dev,
DeviceState *gpio_pwr_dev;
/* gpio-pwr */
- gpio_pwr_dev = sysbus_create_simple("gpio-pwr", -1, NULL);
+ gpio_pwr_dev = sysbus_create_simple_orphan("gpio-pwr", -1, NULL);
/* connect secure pl061 to gpio-pwr */
qdev_connect_gpio_out(pl061_dev, SECURE_GPIO_RESET,
@@ -1746,7 +1746,7 @@ static void create_virtio_devices(const VirtMachineState *vms)
int irq = vms->irqmap[VIRT_MMIO] + i;
hwaddr base = vms->memmap[VIRT_MMIO].base + i * size;
- sysbus_create_simple("virtio-mmio", base,
+ sysbus_create_simple_orphan("virtio-mmio", base,
qdev_get_gpio_in(vms->gic, irq));
}
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 8c3b47d07a..7f31cd6088 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -269,7 +269,7 @@ static void zynq_init(MachineState *machine)
sysbus_realize_and_unref(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, MPCORE_PERIPHBASE);
zynq_binfo.gic_cpu_if_addr = MPCORE_PERIPHBASE + 0x100;
- sysbus_create_varargs("l2x0", MPCORE_PERIPHBASE + 0x2000, NULL);
+ sysbus_create_varargs_orphan("l2x0", MPCORE_PERIPHBASE + 0x2000, NULL);
for (n = 0; n < smp_cpus; n++) {
/* See "hw/intc/arm_gic.h" for the IRQ line association */
DeviceState *cpudev = DEVICE(zynq_machine->cpu[n]);
@@ -287,8 +287,8 @@ static void zynq_init(MachineState *machine)
n = zynq_init_spi_flashes(0xE0007000, pic[81 - GIC_INTERNAL], false, n);
n = zynq_init_spi_flashes(0xE000D000, pic[51 - GIC_INTERNAL], true, n);
- sysbus_create_simple(TYPE_CHIPIDEA, 0xE0002000, pic[53 - GIC_INTERNAL]);
- sysbus_create_simple(TYPE_CHIPIDEA, 0xE0003000, pic[76 - GIC_INTERNAL]);
+ sysbus_create_simple_orphan(TYPE_CHIPIDEA, 0xE0002000, pic[53 - GIC_INTERNAL]);
+ sysbus_create_simple_orphan(TYPE_CHIPIDEA, 0xE0003000, pic[76 - GIC_INTERNAL]);
dev = qdev_new_orphan(TYPE_CADENCE_UART);
busdev = SYS_BUS_DEVICE(dev);
@@ -307,9 +307,9 @@ static void zynq_init(MachineState *machine)
sysbus_mmio_map(busdev, 0, 0xE0001000);
sysbus_connect_irq(busdev, 0, pic[82 - GIC_INTERNAL]);
- sysbus_create_varargs("cadence_ttc", 0xF8001000,
+ sysbus_create_varargs_orphan("cadence_ttc", 0xF8001000,
pic[42-GIC_INTERNAL], pic[43-GIC_INTERNAL], pic[44-GIC_INTERNAL], NULL);
- sysbus_create_varargs("cadence_ttc", 0xF8002000,
+ sysbus_create_varargs_orphan("cadence_ttc", 0xF8002000,
pic[69-GIC_INTERNAL], pic[70-GIC_INTERNAL], pic[71-GIC_INTERNAL], NULL);
ddr_ctrl_init(0xF8006000);
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index fe8baf73b5..bbacb07e1a 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -209,7 +209,40 @@ static void sysbus_device_realize(DeviceState *dev, Error **errp)
{
}
-DeviceState *sysbus_create_varargs(const char *name,
+static void sysbus_create_tail(SysBusDevice *s, hwaddr addr, va_list va)
+{
+ qemu_irq irq;
+ int n;
+
+ if (addr != (hwaddr)-1) {
+ sysbus_mmio_map(s, 0, addr);
+ }
+ n = 0;
+ while (1) {
+ irq = va_arg(va, qemu_irq);
+ if (!irq) {
+ break;
+ }
+ sysbus_connect_irq(s, n, irq);
+ n++;
+ }
+}
+
+DeviceState *sysbus_create_varargs(Object *parent, const char *id,
+ const char *type, hwaddr addr, ...)
+{
+ DeviceState *dev;
+ va_list va;
+
+ dev = qdev_new(parent, id, type);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
+ va_start(va, addr);
+ sysbus_create_tail(SYS_BUS_DEVICE(dev), addr, va);
+ va_end(va);
+ return dev;
+}
+
+DeviceState *sysbus_create_varargs_orphan(const char *name,
hwaddr addr, ...)
{
DeviceState *dev;
diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c
index e3dad136d3..de0df2c82a 100644
--- a/hw/i386/kvm/clock.c
+++ b/hw/i386/kvm/clock.c
@@ -377,7 +377,7 @@ void kvmclock_create(bool create_always)
if (create_always ||
cpu->env.features[FEAT_KVM] & (CPUID_KVM_CLOCK |
CPUID_KVM_CLOCK2)) {
- sysbus_create_simple(TYPE_KVM_CLOCK, -1, NULL);
+ sysbus_create_simple_orphan(TYPE_KVM_CLOCK, -1, NULL);
}
}
diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c
index 8b243984e4..1a406fbc00 100644
--- a/hw/i386/kvm/xen_evtchn.c
+++ b/hw/i386/kvm/xen_evtchn.c
@@ -306,7 +306,7 @@ static void gsi_assert_bh(void *opaque)
void xen_evtchn_create(unsigned int nr_gsis, qemu_irq *system_gsis)
{
- XenEvtchnState *s = XEN_EVTCHN(sysbus_create_simple(TYPE_XEN_EVTCHN,
+ XenEvtchnState *s = XEN_EVTCHN(sysbus_create_simple_orphan(TYPE_XEN_EVTCHN,
-1, NULL));
int i;
diff --git a/hw/i386/kvm/xen_gnttab.c b/hw/i386/kvm/xen_gnttab.c
index 85b324e62d..eb43e9f385 100644
--- a/hw/i386/kvm/xen_gnttab.c
+++ b/hw/i386/kvm/xen_gnttab.c
@@ -152,7 +152,7 @@ static const TypeInfo xen_gnttab_info = {
void xen_gnttab_create(void)
{
- xen_gnttab_singleton = XEN_GNTTAB(sysbus_create_simple(TYPE_XEN_GNTTAB,
+ xen_gnttab_singleton = XEN_GNTTAB(sysbus_create_simple_orphan(TYPE_XEN_GNTTAB,
-1, NULL));
}
diff --git a/hw/i386/kvm/xen_overlay.c b/hw/i386/kvm/xen_overlay.c
index 74cadffb72..1ef47539e4 100644
--- a/hw/i386/kvm/xen_overlay.c
+++ b/hw/i386/kvm/xen_overlay.c
@@ -169,7 +169,7 @@ static const TypeInfo xen_overlay_info = {
void xen_overlay_create(void)
{
- xen_overlay_singleton = XEN_OVERLAY(sysbus_create_simple(TYPE_XEN_OVERLAY,
+ xen_overlay_singleton = XEN_OVERLAY(sysbus_create_simple_orphan(TYPE_XEN_OVERLAY,
-1, NULL));
/* If xen_domid wasn't explicitly set, at least make sure it isn't zero. */
diff --git a/hw/i386/kvm/xen_primary_console.c b/hw/i386/kvm/xen_primary_console.c
index bf61f6235b..f22ce4b14b 100644
--- a/hw/i386/kvm/xen_primary_console.c
+++ b/hw/i386/kvm/xen_primary_console.c
@@ -84,7 +84,7 @@ static const TypeInfo xen_primary_console_info = {
void xen_primary_console_create(void)
{
- DeviceState *dev = sysbus_create_simple(TYPE_XEN_PRIMARY_CONSOLE, -1, NULL);
+ DeviceState *dev = sysbus_create_simple_orphan(TYPE_XEN_PRIMARY_CONSOLE, -1, NULL);
trace_xen_primary_console_create();
diff --git a/hw/i386/kvm/xen_xenstore.c b/hw/i386/kvm/xen_xenstore.c
index 0dc0edf3bf..92493bcb6d 100644
--- a/hw/i386/kvm/xen_xenstore.c
+++ b/hw/i386/kvm/xen_xenstore.c
@@ -276,7 +276,7 @@ static const TypeInfo xen_xenstore_info = {
void xen_xenstore_create(void)
{
- DeviceState *dev = sysbus_create_simple(TYPE_XEN_XENSTORE, -1, NULL);
+ DeviceState *dev = sysbus_create_simple_orphan(TYPE_XEN_XENSTORE, -1, NULL);
xen_xenstore_singleton = XEN_XENSTORE(dev);
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 08d54c277f..22688687c4 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -197,7 +197,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
}
for (i = 0; i < mms->virtio_num_transports; i++) {
- sysbus_create_simple("virtio-mmio",
+ sysbus_create_simple_orphan("virtio-mmio",
VIRTIO_MMIO_BASE + i * 512,
x86ms->gsi[mms->virtio_irq_base + i]);
}
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index 49c03a5bce..aaa7dca480 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -282,7 +282,7 @@ static void apic_common_realize(DeviceState *dev, Error **errp)
/* Note: We need at least 1M to map the VAPIC option ROM */
if (!vapic && s->vapic_control & VAPIC_ENABLE_MASK &&
current_machine->ram_size >= 1024 * 1024) {
- vapic = sysbus_create_simple("kvmvapic", -1, NULL);
+ vapic = sysbus_create_simple_orphan("kvmvapic", -1, NULL);
}
s->vapic = vapic;
if (apic_report_tpr_access && info->enable_tpr_reporting) {
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 23751c46d7..45acdc3ec1 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -485,7 +485,7 @@ static void virt_devices_init(DeviceState *pch_pic,
* Create some unimplemented devices to emulate this.
*/
create_unimplemented_device("pci-dma-cfg", 0x1001041c, 0x4);
- sysbus_create_simple("ls7a_rtc", VIRT_RTC_REG_BASE,
+ sysbus_create_simple_orphan("ls7a_rtc", VIRT_RTC_REG_BASE,
qdev_get_gpio_in(pch_pic,
VIRT_RTC_IRQ - VIRT_GSI_BASE));
diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c
index 5bb123594d..0c1f5b4481 100644
--- a/hw/m68k/next-cube.c
+++ b/hw/m68k/next-cube.c
@@ -1280,7 +1280,7 @@ static void next_cube_init(MachineState *machine)
memory_region_add_subregion(sysmem, 0x04000000, machine->ram);
/* Framebuffer */
- sysbus_create_simple(TYPE_NEXTFB, 0x0B000000, NULL);
+ sysbus_create_simple_orphan(TYPE_NEXTFB, 0x0B000000, NULL);
/* MMIO */
sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 0, 0x02005000);
@@ -1319,7 +1319,7 @@ static void next_cube_init(MachineState *machine)
memory_region_add_subregion(sysmem, 0x820c0000, &m->bmapm2);
/* KBD */
- sysbus_create_simple(TYPE_NEXTKBD, 0x0200e000, NULL);
+ sysbus_create_simple_orphan(TYPE_NEXTKBD, 0x0200e000, NULL);
/* Load ROM here */
memory_region_init_rom(&m->rom, NULL, "next.rom", 0x20000, &error_fatal);
diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c
index f86d55d96c..e2af0196e8 100644
--- a/hw/m68k/virt.c
+++ b/hw/m68k/virt.c
@@ -202,7 +202,7 @@ static void virt_init(MachineState *machine)
sysbus_connect_irq(sysbus, 0, PIC_GPIO(VIRT_GF_TTY_IRQ_BASE));
/* virt controller */
- dev = sysbus_create_simple(TYPE_VIRT_CTRL, VIRT_CTRL_MMIO_BASE,
+ dev = sysbus_create_simple_orphan(TYPE_VIRT_CTRL, VIRT_CTRL_MMIO_BASE,
PIC_GPIO(VIRT_CTRL_IRQ_BASE));
/* virtio-mmio */
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index f9be67249f..a902e400cf 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -395,7 +395,7 @@ static void mips_jazz_init(MachineState *machine,
sysbus_mmio_map(sysbus, 0, 0x80009000);
/* LED indicator */
- sysbus_create_simple("jazz-led", 0x8000f000, NULL);
+ sysbus_create_simple_orphan("jazz-led", 0x8000f000, NULL);
g_free(dmas);
}
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index d3b728339e..854f7f6801 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -536,7 +536,7 @@ static void mips_loongson3_virt_init(MachineState *machine)
qdev_get_gpio_in(liointc, UART_IRQ), 115200, serial_hd(0),
DEVICE_LITTLE_ENDIAN);
- sysbus_create_simple("goldfish_rtc", virt_memmap[VIRT_RTC].base,
+ sysbus_create_simple_orphan("goldfish_rtc", virt_memmap[VIRT_RTC].base,
qdev_get_gpio_in(liointc, RTC_IRQ));
cpuclk = clock_new(OBJECT(machine), "cpu-refclk");
diff --git a/hw/or1k/virt.c b/hw/or1k/virt.c
index 3067a5b2e7..9451a0b7df 100644
--- a/hw/or1k/virt.c
+++ b/hw/or1k/virt.c
@@ -300,7 +300,7 @@ static void openrisc_virt_rtc_init(OR1KVirtState *state, hwaddr base,
qemu_irq rtc_irq = get_per_cpu_irq(cpus, num_cpus, irq_pin);
/* Goldfish RTC */
- sysbus_create_simple(TYPE_GOLDFISH_RTC, base, rtc_irq);
+ sysbus_create_simple_orphan(TYPE_GOLDFISH_RTC, base, rtc_irq);
/* Goldfish RTC FDT */
nodename = g_strdup_printf("/soc/rtc@%" HWADDR_PRIx, base);
diff --git a/hw/ppc/amigaone.c b/hw/ppc/amigaone.c
index bcdf36b344..528c2c656a 100644
--- a/hw/ppc/amigaone.c
+++ b/hw/ppc/amigaone.c
@@ -329,7 +329,7 @@ static void amigaone_init(MachineState *machine)
}
/* Articia S */
- dev = sysbus_create_simple(TYPE_ARTICIA, ARTICIA_ADDR, NULL);
+ dev = sysbus_create_simple_orphan(TYPE_ARTICIA, ARTICIA_ADDR, NULL);
i2c_bus = I2C_BUS(qdev_get_child_bus(dev, "smbus"));
if (machine->ram_size > 512 * MiB) {
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 65e71826a4..05c305b72c 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -1076,7 +1076,7 @@ void ppce500_init(MachineState *machine)
}
/* Register spinning region */
- sysbus_create_simple("e500-spin", pmc->spin_base, NULL);
+ sysbus_create_simple_orphan("e500-spin", pmc->spin_base, NULL);
if (pmc->has_mpc8xxx_gpio) {
qemu_irq poweroff_irq;
diff --git a/hw/ppc/pegasos.c b/hw/ppc/pegasos.c
index 9d7e279123..3dc02423ee 100644
--- a/hw/ppc/pegasos.c
+++ b/hw/ppc/pegasos.c
@@ -218,7 +218,7 @@ static void pegasos_init(MachineState *machine)
MemoryRegion *pci_mem, *mr;
/* Articia S */
- pm->nb = DEVICE(sysbus_create_simple(TYPE_ARTICIA, 0xfe000000, NULL));
+ pm->nb = DEVICE(sysbus_create_simple_orphan(TYPE_ARTICIA, 0xfe000000, NULL));
pci_mem = sysbus_mmio_get_region(SYS_BUS_DEVICE(pm->nb), 1);
mr = g_new(MemoryRegion, 1);
memory_region_init_alias(mr, OBJECT(pm->nb), "pci-mem-low", pci_mem,
@@ -233,7 +233,7 @@ static void pegasos_init(MachineState *machine)
}
case PEGASOS2:
/* Marvell Discovery II system controller */
- pm->nb = DEVICE(sysbus_create_simple(TYPE_MV64361, -1,
+ pm->nb = DEVICE(sysbus_create_simple_orphan(TYPE_MV64361, -1,
qdev_get_gpio_in(DEVICE(pm->cpu), PPC6xx_INPUT_INT)));
pci_bus = mv64361_get_pci_bus(pm->nb, 1);
break;
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index e76d359e43..7a6c3ebec5 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -183,7 +183,7 @@ static void bamboo_init(MachineState *machine)
ppc4xx_sdram_ddr_enable(PPC4xx_SDRAM_DDR(dev));
/* PCI */
- dev = sysbus_create_varargs(TYPE_PPC4xx_PCI_HOST, PPC440EP_PCI_CONFIG,
+ dev = sysbus_create_varargs_orphan(TYPE_PPC4xx_PCI_HOST, PPC440EP_PCI_CONFIG,
qdev_get_gpio_in(uicdev, pci_irq_nrs[0]),
qdev_get_gpio_in(uicdev, pci_irq_nrs[1]),
qdev_get_gpio_in(uicdev, pci_irq_nrs[2]),
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 778b04c532..88c4e66b2d 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -336,7 +336,7 @@ static void sam460ex_init(MachineState *machine)
ppc4xx_sdram_ddr2_enable(PPC4xx_SDRAM_DDR2(dev));
/* IIC controllers and devices */
- dev = sysbus_create_simple(TYPE_PPC4xx_I2C, 0x4ef600700,
+ dev = sysbus_create_simple_orphan(TYPE_PPC4xx_I2C, 0x4ef600700,
qdev_get_gpio_in(uic[0], 2));
i2c = PPC4xx_I2C(dev)->bus;
/* SPD EEPROM on RAM module */
@@ -347,7 +347,7 @@ static void sam460ex_init(MachineState *machine)
/* RTC */
i2c_slave_create_simple(i2c, "m41t80", 0x68);
- dev = sysbus_create_simple(TYPE_PPC4xx_I2C, 0x4ef600800,
+ dev = sysbus_create_simple_orphan(TYPE_PPC4xx_I2C, 0x4ef600800,
qdev_get_gpio_in(uic[0], 3));
/* External bus controller */
@@ -387,7 +387,7 @@ static void sam460ex_init(MachineState *machine)
l2cache_ram);
/* USB */
- sysbus_create_simple(TYPE_PPC4xx_EHCI, 0x4bffd0400,
+ sysbus_create_simple_orphan(TYPE_PPC4xx_EHCI, 0x4bffd0400,
qdev_get_gpio_in(uic[2], 29));
dev = qdev_new_orphan("sysbus-ohci");
qdev_prop_set_string(dev, "masterbus", "usb-bus.0");
@@ -416,7 +416,7 @@ static void sam460ex_init(MachineState *machine)
/* PCI bus */
/* All PCI irqs are connected to the same UIC pin (cf. UBoot source) */
- dev = sysbus_create_simple(TYPE_PPC440_PCIX_HOST, 0xc0ec00000,
+ dev = sysbus_create_simple_orphan(TYPE_PPC440_PCIX_HOST, 0xc0ec00000,
qdev_get_gpio_in(uic[1], 0));
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 1, 0xc08000000);
pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci.0"));
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index 449cb52201..44e1cfa7be 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -1474,7 +1474,7 @@ static void virt_machine_init(MachineState *machine)
/* VirtIO MMIO devices */
for (i = 0; i < VIRTIO_COUNT; i++) {
- sysbus_create_simple("virtio-mmio",
+ sysbus_create_simple_orphan("virtio-mmio",
s->memmap[VIRT_VIRTIO].base + i * s->memmap[VIRT_VIRTIO].size,
qdev_get_gpio_in(virtio_irqchip, VIRTIO_IRQ + i));
}
@@ -1487,7 +1487,7 @@ static void virt_machine_init(MachineState *machine)
0, qdev_get_gpio_in(mmio_irqchip, UART0_IRQ), 399193,
serial_hd(0), DEVICE_LITTLE_ENDIAN);
- sysbus_create_simple("goldfish_rtc", s->memmap[VIRT_RTC].base,
+ sysbus_create_simple_orphan("goldfish_rtc", s->memmap[VIRT_RTC].base,
qdev_get_gpio_in(mmio_irqchip, RTC_IRQ));
for (i = 0; i < ARRAY_SIZE(s->flash); i++) {
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 69a287937e..80e37555b1 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -1018,7 +1018,7 @@ static void sun4m_hw_init(MachineState *machine)
slavio_irq[30], fdc_tc);
if (hwdef->cs_base) {
- sysbus_create_simple("sun-CS4231", hwdef->cs_base,
+ sysbus_create_simple_orphan("sun-CS4231", hwdef->cs_base,
slavio_irq[5]);
}
diff --git a/hw/vmapple/vmapple.c b/hw/vmapple/vmapple.c
index 9f69ab2bc7..bf19faa04a 100644
--- a/hw/vmapple/vmapple.c
+++ b/hw/vmapple/vmapple.c
@@ -305,7 +305,7 @@ static void create_rtc(const VMAppleMachineState *vms)
hwaddr base = vms->memmap[VMAPPLE_RTC].base;
int irq = vms->irqmap[VMAPPLE_RTC];
- sysbus_create_simple("pl031", base, qdev_get_gpio_in(vms->gic, irq));
+ sysbus_create_simple_orphan("pl031", base, qdev_get_gpio_in(vms->gic, irq));
}
static DeviceState *gpio_key_dev;
@@ -331,7 +331,7 @@ static void create_gpio_devices(const VMAppleMachineState *vms, int gpio,
sysbus_realize_and_unref(s, &error_fatal);
memory_region_add_subregion(mem, base, sysbus_mmio_get_region(s, 0));
sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq));
- gpio_key_dev = sysbus_create_simple("gpio-key", -1,
+ gpio_key_dev = sysbus_create_simple_orphan("gpio-key", -1,
qdev_get_gpio_in(pl061_dev, 3));
}
diff --git a/hw/xen/xen-pvh-common.c b/hw/xen/xen-pvh-common.c
index 4c9a4fdea8..17f545d07c 100644
--- a/hw/xen/xen-pvh-common.c
+++ b/hw/xen/xen-pvh-common.c
@@ -173,7 +173,7 @@ static void xen_create_virtio_mmio_devices(XenPVHMachineState *s)
qemu_irq irq = qemu_allocate_irq(xen_set_irq, NULL,
s->cfg.virtio_mmio_irq_base + i);
- sysbus_create_simple("virtio-mmio", base, irq);
+ sysbus_create_simple_orphan("virtio-mmio", base, irq);
trace_xen_create_virtio_mmio_devices(i,
s->cfg.virtio_mmio_irq_base + i,
diff --git a/include/hw/core/sysbus.h b/include/hw/core/sysbus.h
index f3c4259d29..7737c959c5 100644
--- a/include/hw/core/sysbus.h
+++ b/include/hw/core/sysbus.h
@@ -91,15 +91,39 @@ bool sysbus_realize_and_unref(SysBusDevice *dev, Error **errp);
/* Call func for every dynamically created sysbus device in the system */
void foreach_dynamic_sysbus_device(FindSysbusDeviceFunc *func, void *opaque);
-/* Legacy helper function for creating devices. */
-DeviceState *sysbus_create_varargs(const char *name,
+/**
+ * sysbus_create_varargs: Create, parent and realize a sysbus device
+ * @parent: the QOM parent (usually the machine or containing device)
+ * @id: child<> property name
+ * @type: sysbus device type to create
+ * @addr: MMIO region 0 address, or -1 for none
+ * @...: NULL-terminated list of qemu_irq to connect
+ *
+ * Create a sysbus device via qdev_new(@parent, @id, @type), realize
+ * it, optionally map MMIO region 0 at @addr, and connect the given
+ * IRQs. The returned device is owned by @parent.
+ */
+DeviceState *sysbus_create_varargs(Object *parent, const char *id,
+ const char *type, hwaddr addr, ...);
+
+static inline DeviceState *sysbus_create_simple(Object *parent,
+ const char *id,
+ const char *type,
+ hwaddr addr,
+ qemu_irq irq)
+{
+ return sysbus_create_varargs(parent, id, type, addr, irq, NULL);
+}
+
+/* Legacy helper function for creating unparented devices. */
+DeviceState *sysbus_create_varargs_orphan(const char *name,
hwaddr addr, ...);
-static inline DeviceState *sysbus_create_simple(const char *name,
+static inline DeviceState *sysbus_create_simple_orphan(const char *name,
hwaddr addr,
qemu_irq irq)
{
- return sysbus_create_varargs(name, addr, irq, NULL);
+ return sysbus_create_varargs_orphan(name, addr, irq, NULL);
}
#endif /* HW_SYSBUS_H */
diff --git a/scripts/coccinelle/qom-parent/sysbus-create-orphan.cocci b/scripts/coccinelle/qom-parent/sysbus-create-orphan.cocci
new file mode 100644
index 0000000000..b925d9396f
--- /dev/null
+++ b/scripts/coccinelle/qom-parent/sysbus-create-orphan.cocci
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+//
+// Rename sysbus_create_simple()/sysbus_create_varargs() to *_orphan()
+// so that the short names can be reintroduced with a mandatory
+// (parent, id, ...) signature.
+//
+// spatch --sp-file scripts/coccinelle/qom-parent/sysbus-create-orphan.cocci \
+// --in-place --include-headers --dir .
+
+@@
+@@
+- sysbus_create_simple
++ sysbus_create_simple_orphan
+
+@@
+@@
+- sysbus_create_varargs
++ sysbus_create_varargs_orphan
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 004/134] sysbus: Make sysbus_create_simple()/_varargs() take a QOM parent
2026-07-11 22:34 ` [RFC PATCH 004/134] sysbus: Make sysbus_create_simple()/_varargs() take a " Alexander Graf
@ 2026-07-13 10:54 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 156+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-07-13 10:54 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
On 12/7/26 00:34, Alexander Graf wrote:
> Sysbus is by far the largest producer of orphaned onboard devices:
> of the ~1180 unparented device creation sites in the tree, well over
> half go through sysbus_create_simple(), sysbus_create_varargs(), or
> qdev_new_orphan()+sysbus_realize_and_unref() open-coded.
>
> Apply the same rename-and-reintroduce treatment as qdev_new():
> mechanically rename the existing helpers to *_orphan() and
> reintroduce the short names with a leading (parent, id, ...) pair
> that plumbs down to the new qdev_new(). The parented versions call
> sysbus_realize() (not _and_unref) since the child<> property already
> holds the sole reference.
>
> The mechanical rename part is generated by
>
> spatch --sp-file \
> scripts/coccinelle/qom-parent/sysbus-create-orphan.cocci \
> --in-place --include-headers --dir .
>
> or equivalently
>
> git ls-files '*.[ch]' '*.[ch].inc' '*.rst' '*.py' | \
> grep -v '^subprojects/' | \
> xargs sed -i \
> 's/\bsysbus_create_simple\b/sysbus_create_simple_orphan/g;
> s/\bsysbus_create_varargs\b/sysbus_create_varargs_orphan/g'
>
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> hw/arm/allwinner-h3.c | 16 ++++-----
> hw/arm/collie.c | 2 +-
> hw/arm/exynos4210.c | 14 ++++----
> hw/arm/fsl-imx6.c | 2 +-
> hw/arm/integratorcp.c | 18 +++++-----
> hw/arm/mps2.c | 6 ++--
> hw/arm/musicpal.c | 18 +++++-----
> hw/arm/npcm7xx.c | 2 +-
> hw/arm/realview.c | 24 ++++++-------
> hw/arm/sbsa-ref.c | 6 ++--
> hw/arm/stellaris.c | 8 ++---
> hw/arm/strongarm.c | 10 +++---
> hw/arm/versatilepb.c | 28 +++++++--------
> hw/arm/vexpress.c | 20 +++++------
> hw/arm/virt.c | 8 ++---
> hw/arm/xilinx_zynq.c | 10 +++---
> hw/core/sysbus.c | 35 ++++++++++++++++++-
> hw/i386/kvm/clock.c | 2 +-
> hw/i386/kvm/xen_evtchn.c | 2 +-
> hw/i386/kvm/xen_gnttab.c | 2 +-
> hw/i386/kvm/xen_overlay.c | 2 +-
> hw/i386/kvm/xen_primary_console.c | 2 +-
> hw/i386/kvm/xen_xenstore.c | 2 +-
> hw/i386/microvm.c | 2 +-
> hw/intc/apic_common.c | 2 +-
> hw/loongarch/virt.c | 2 +-
> hw/m68k/next-cube.c | 4 +--
> hw/m68k/virt.c | 2 +-
> hw/mips/jazz.c | 2 +-
> hw/mips/loongson3_virt.c | 2 +-
> hw/or1k/virt.c | 2 +-
> hw/ppc/amigaone.c | 2 +-
> hw/ppc/e500.c | 2 +-
> hw/ppc/pegasos.c | 4 +--
> hw/ppc/ppc440_bamboo.c | 2 +-
> hw/ppc/sam460ex.c | 8 ++---
> hw/riscv/virt.c | 4 +--
> hw/sparc/sun4m.c | 2 +-
> hw/vmapple/vmapple.c | 4 +--
> hw/xen/xen-pvh-common.c | 2 +-
> include/hw/core/sysbus.h | 32 ++++++++++++++---
> .../qom-parent/sysbus-create-orphan.cocci | 18 ++++++++++
> 42 files changed, 206 insertions(+), 131 deletions(-)
> create mode 100644 scripts/coccinelle/qom-parent/sysbus-create-orphan.cocci
> diff --git a/include/hw/core/sysbus.h b/include/hw/core/sysbus.h
> index f3c4259d29..7737c959c5 100644
> --- a/include/hw/core/sysbus.h
> +++ b/include/hw/core/sysbus.h
> @@ -91,15 +91,39 @@ bool sysbus_realize_and_unref(SysBusDevice *dev, Error **errp);
> /* Call func for every dynamically created sysbus device in the system */
> void foreach_dynamic_sysbus_device(FindSysbusDeviceFunc *func, void *opaque);
>
> -/* Legacy helper function for creating devices. */
> -DeviceState *sysbus_create_varargs(const char *name,
> +/**
> + * sysbus_create_varargs: Create, parent and realize a sysbus device
> + * @parent: the QOM parent (usually the machine or containing device)
> + * @id: child<> property name
> + * @type: sysbus device type to create
> + * @addr: MMIO region 0 address, or -1 for none
> + * @...: NULL-terminated list of qemu_irq to connect
> + *
> + * Create a sysbus device via qdev_new(@parent, @id, @type), realize
> + * it, optionally map MMIO region 0 at @addr, and connect the given
> + * IRQs. The returned device is owned by @parent.
> + */
> +DeviceState *sysbus_create_varargs(Object *parent, const char *id,
> + const char *type, hwaddr addr, ...);
> +
> +static inline DeviceState *sysbus_create_simple(Object *parent,
Both are legacy. Updating the doc:
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
> + const char *id,
> + const char *type,
> + hwaddr addr,
> + qemu_irq irq)
> +{
> + return sysbus_create_varargs(parent, id, type, addr, irq, NULL);
> +}
> +
> +/* Legacy helper function for creating unparented devices. */
> +DeviceState *sysbus_create_varargs_orphan(const char *name,
> hwaddr addr, ...);
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 005/134] pci: Make pci_new*()/pci_create_simple*() take a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (3 preceding siblings ...)
2026-07-11 22:34 ` [RFC PATCH 004/134] sysbus: Make sysbus_create_simple()/_varargs() take a " Alexander Graf
@ 2026-07-11 22:34 ` Alexander Graf
2026-07-11 22:34 ` [RFC PATCH 006/134] isa: Make isa_new()/isa_try_new()/isa_create_simple() " Alexander Graf
` (129 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:34 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Same rename-and-reintroduce treatment as qdev_new() and
sysbus_create_*(): mechanically rename the four PCI creation
helpers to *_orphan() and reintroduce the short names with a
leading (parent, id, ...) pair.
The parented pci_create_simple*() variants call qdev_realize() (not
pci_realize_and_unref()) since the child<> property already holds
the sole reference.
The mechanical rename part is generated by
spatch --sp-file scripts/coccinelle/qom-parent/pci-new-orphan.cocci \
--in-place --include-headers --dir .
or equivalently
git ls-files '*.[ch]' '*.[ch].inc' '*.rst' '*.py' | \
grep -v '^subprojects/' | \
xargs sed -i \
's/\bpci_create_simple_multifunction\b/&_orphan/g;
s/\bpci_create_simple\b/&_orphan/g;
s/\bpci_new_multifunction\b/&_orphan/g;
s/\bpci_new\b/&_orphan/g'
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/alpha/dp264.c | 4 +-
hw/arm/realview.c | 4 +-
hw/arm/sbsa-ref.c | 2 +-
hw/arm/versatilepb.c | 4 +-
hw/hppa/machine.c | 8 +--
hw/i386/pc.c | 2 +-
hw/i386/pc_piix.c | 4 +-
hw/i386/pc_q35.c | 10 +--
hw/mips/boston.c | 2 +-
hw/mips/fuloong2e.c | 4 +-
hw/mips/loongson3_virt.c | 2 +-
hw/mips/malta.c | 2 +-
hw/pci-host/articia.c | 4 +-
hw/pci-host/bonito.c | 2 +-
hw/pci-host/grackle.c | 2 +-
hw/pci-host/gt64120.c | 2 +-
hw/pci-host/i440fx.c | 2 +-
hw/pci-host/mv64361.c | 2 +-
hw/pci-host/pnv_phb.c | 2 +-
hw/pci-host/ppc4xx_pci.c | 2 +-
hw/pci-host/ppce500.c | 2 +-
hw/pci-host/raven.c | 2 +-
hw/pci-host/sabre.c | 6 +-
hw/pci-host/sh_pci.c | 2 +-
hw/pci-host/uninorth.c | 8 +--
hw/pci/pci.c | 65 +++++++++++++++----
hw/pci/pcie_sriov.c | 2 +-
hw/ppc/amigaone.c | 2 +-
hw/ppc/mac_newworld.c | 4 +-
hw/ppc/mac_oldworld.c | 4 +-
hw/ppc/pegasos.c | 2 +-
hw/ppc/prep.c | 4 +-
hw/ppc/sam460ex.c | 4 +-
hw/ppc/spapr.c | 2 +-
hw/riscv/boston-aia.c | 2 +-
hw/sparc64/sun4u.c | 8 +--
hw/vfio/igd.c | 2 +-
hw/xen/xen_pt_graphics.c | 2 +-
include/hw/pci/pci.h | 18 +++--
.../qom-parent/pci-new-orphan.cocci | 28 ++++++++
40 files changed, 157 insertions(+), 78 deletions(-)
create mode 100644 scripts/coccinelle/qom-parent/pci-new-orphan.cocci
diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index f928e0cee8..6999168df6 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -110,7 +110,7 @@ static void clipper_init(MachineState *machine)
* Importantly, we need to provide a PCI device node for it, otherwise
* some operating systems won't notice there's an ISA bus to configure.
*/
- i82378_dev = DEVICE(pci_create_simple(pci_bus, PCI_DEVFN(7, 0), "i82378"));
+ i82378_dev = DEVICE(pci_create_simple_orphan(pci_bus, PCI_DEVFN(7, 0), "i82378"));
isa_bus = ISA_BUS(qdev_get_child_bus(i82378_dev, "isa.0"));
/* Connect the ISA PIC to the Typhoon IRQ used for ISA interrupts. */
@@ -129,7 +129,7 @@ static void clipper_init(MachineState *machine)
isa_create_simple(isa_bus, TYPE_SMC37C669_SUPERIO);
/* IDE disk setup. */
- pci_dev = pci_create_simple(pci_bus, -1, "cmd646-ide");
+ pci_dev = pci_create_simple_orphan(pci_bus, -1, "cmd646-ide");
pci_ide_create_devs(pci_dev);
/* Load PALcode. Given that this is not "real" cpu palcode,
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index 287c092c2d..0642e35dd2 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -297,11 +297,11 @@ static void realview_init(MachineState *machine,
sysbus_connect_irq(busdev, 3, pic[51]);
pci_bus = (PCIBus *)qdev_get_child_bus(dev, "pci");
if (machine_usb(machine)) {
- pci_create_simple(pci_bus, -1, "pci-ohci");
+ pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
}
n = drive_get_max_bus(IF_SCSI);
while (n >= 0) {
- dev = DEVICE(pci_create_simple(pci_bus, -1, "lsi53c895a"));
+ dev = DEVICE(pci_create_simple_orphan(pci_bus, -1, "lsi53c895a"));
lsi53c8xx_handle_legacy_cmdline(dev);
n--;
}
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
index a821833fa7..f9fb681d31 100644
--- a/hw/arm/sbsa-ref.c
+++ b/hw/arm/sbsa-ref.c
@@ -695,7 +695,7 @@ static void create_pcie(SBSAMachineState *sms,
pci_init_nic_devices(pci->bus, mc->default_nic);
- pci_create_simple(pci->bus, -1, "bochs-display");
+ pci_create_simple_orphan(pci->bus, -1, "bochs-display");
create_smmu(sms, pci->bus, sysmem, secure_sysmem);
}
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index b80410db0d..81bd397b5d 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -270,11 +270,11 @@ static void versatile_init(MachineState *machine, int board_id)
pci_init_nic_devices(pci_bus, "rtl8139");
if (machine_usb(machine)) {
- pci_create_simple(pci_bus, -1, "pci-ohci");
+ pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
}
n = drive_get_max_bus(IF_SCSI);
while (n >= 0) {
- dev = DEVICE(pci_create_simple(pci_bus, -1, "lsi53c895a"));
+ dev = DEVICE(pci_create_simple_orphan(pci_bus, -1, "lsi53c895a"));
lsi53c8xx_handle_legacy_cmdline(dev);
n--;
}
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 02cafbda85..91fe4845c4 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -428,7 +428,7 @@ static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
if (pci_bus && hppa_is_pa20(&cpu[0]->env)) {
/* BMC board: HP Diva GSP PCI card */
- pci_dev = pci_new_multifunction(PCI_DEVFN(2, 0), "diva-gsp");
+ pci_dev = pci_new_multifunction_orphan(PCI_DEVFN(2, 0), "diva-gsp");
if (!lasi_dev) {
/* bind default keyboard/serial to Diva card */
qdev_prop_set_chr(DEVICE(pci_dev), "chardev1", serial_hd(0));
@@ -443,7 +443,7 @@ static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
if (!lasi_dev && machine->enable_graphics && defaults_enabled()) {
USBBus *usb_bus;
- pci_create_simple(pci_bus, -1, "pci-ohci");
+ pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
usb_create_simple(usb_bus, "usb-kbd");
@@ -721,7 +721,7 @@ static void machine_HP_B160L_init(MachineState *machine)
/* SCSI disk setup. */
if (drive_get_max_bus(IF_SCSI) >= 0) {
- dev = DEVICE(pci_create_simple(pci_bus, -1, "lsi53c895a"));
+ dev = DEVICE(pci_create_simple_orphan(pci_bus, -1, "lsi53c895a"));
lsi53c8xx_handle_legacy_cmdline(dev);
}
@@ -773,7 +773,7 @@ static void machine_HP_C3700_init(MachineState *machine)
/* SCSI disk setup. */
if (drive_get_max_bus(IF_SCSI) >= 0) {
- DeviceState *dev = DEVICE(pci_create_simple(pci_bus, -1, "lsi53c895a"));
+ DeviceState *dev = DEVICE(pci_create_simple_orphan(pci_bus, -1, "lsi53c895a"));
lsi53c8xx_handle_legacy_cmdline(dev);
}
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index bd5ab3d854..11a9d5df97 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1104,7 +1104,7 @@ void pc_basic_device_init(struct PCMachineState *pcms,
xen_gnttab_create();
xen_xenstore_create();
if (pcms->pcibus) {
- pci_create_simple(pcms->pcibus, -1, "xen-platform");
+ pci_create_simple_orphan(pcms->pcibus, -1, "xen-platform");
}
xen_bus_init();
}
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index e580f9f2a6..bd4c129143 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -236,7 +236,7 @@ static void pc_init1(MachineState *machine, const char *pci_type)
gsi_state = pc_gsi_create(&x86ms->gsi, true);
- pci_dev = pci_new_multifunction(-1, pcms->south_bridge);
+ pci_dev = pci_new_multifunction_orphan(-1, pcms->south_bridge);
object_property_set_bool(OBJECT(pci_dev), "has-usb",
machine_usb(machine), &error_abort);
object_property_set_bool(OBJECT(pci_dev), "has-acpi",
@@ -384,7 +384,7 @@ static void pc_xen_hvm_init(MachineState *machine)
: TYPE_I440FX_PCI_DEVICE);
xen_igd_reserve_slot(pcms->pcibus);
- pci_create_simple(pcms->pcibus, -1, "xen-platform");
+ pci_create_simple_orphan(pcms->pcibus, -1, "xen-platform");
}
#endif
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 0731403e55..daa75dbc26 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -114,12 +114,12 @@ static int ehci_create_ich9_with_companions(PCIBus *bus, int slot)
return -1;
}
- ehci = pci_new_multifunction(PCI_DEVFN(slot, 7), name);
+ ehci = pci_new_multifunction_orphan(PCI_DEVFN(slot, 7), name);
pci_realize_and_unref(ehci, bus, &error_fatal);
usbbus = QLIST_FIRST(&ehci->qdev.child_bus);
for (i = 0; i < 3; i++) {
- uhci = pci_new_multifunction(PCI_DEVFN(slot, comp[i].func),
+ uhci = pci_new_multifunction_orphan(PCI_DEVFN(slot, comp[i].func),
comp[i].name);
qdev_prop_set_string(&uhci->qdev, "masterbus", usbbus->name);
qdev_prop_set_uint32(&uhci->qdev, "firstport", comp[i].port);
@@ -235,7 +235,7 @@ static void pc_q35_init(MachineState *machine)
gsi_state = pc_gsi_create(&x86ms->gsi, true);
/* create ISA bus */
- lpc = pci_new_multifunction(PCI_DEVFN(ICH9_LPC_DEV, ICH9_LPC_FUNC),
+ lpc = pci_new_multifunction_orphan(PCI_DEVFN(ICH9_LPC_DEV, ICH9_LPC_FUNC),
TYPE_ICH9_LPC_DEVICE);
lpc_dev = DEVICE(lpc);
qdev_prop_set_bit(lpc_dev, "smm-enabled",
@@ -290,7 +290,7 @@ static void pc_q35_init(MachineState *machine)
AHCIPCIState *ich9;
/* ahci and SATA device, for q35 1 ahci controller is built-in */
- pdev = pci_create_simple_multifunction(pcms->pcibus,
+ pdev = pci_create_simple_multifunction_orphan(pcms->pcibus,
PCI_DEVFN(ICH9_SATA1_DEV,
ICH9_SATA1_FUNC),
"ich9-ahci");
@@ -311,7 +311,7 @@ static void pc_q35_init(MachineState *machine)
PCIDevice *smb;
/* TODO: Populate SPD eeprom data. */
- smb = pci_create_simple_multifunction(pcms->pcibus,
+ smb = pci_create_simple_multifunction_orphan(pcms->pcibus,
PCI_DEVFN(ICH9_SMB_DEV,
ICH9_SMB_FUNC),
TYPE_ICH9_SMB_DEVICE);
diff --git a/hw/mips/boston.c b/hw/mips/boston.c
index e328c578a5..18ede54ae8 100644
--- a/hw/mips/boston.c
+++ b/hw/mips/boston.c
@@ -769,7 +769,7 @@ static void boston_mach_init(MachineState *machine)
qemu_chr_fe_set_handlers(&s->lcd_display, NULL, NULL,
boston_lcd_event, NULL, s, NULL, true);
- pdev = pci_create_simple_multifunction(&PCI_BRIDGE(&pcie2->root)->sec_bus,
+ pdev = pci_create_simple_multifunction_orphan(&PCI_BRIDGE(&pcie2->root)->sec_bus,
PCI_DEVFN(0, 0), TYPE_ICH9_AHCI);
ich9 = ICH9_AHCI(pdev);
g_assert(ARRAY_SIZE(hd) == ich9->ahci.ports);
diff --git a/hw/mips/fuloong2e.c b/hw/mips/fuloong2e.c
index 9a712ee930..e0cbf4df3d 100644
--- a/hw/mips/fuloong2e.c
+++ b/hw/mips/fuloong2e.c
@@ -286,7 +286,7 @@ static void mips_fuloong2e_init(MachineState *machine)
pci_bus = bonito_init((qemu_irq *)&(env->irq[2]));
/* South bridge -> IP5 */
- pci_dev = pci_new_multifunction(PCI_DEVFN(FULOONG2E_VIA_SLOT, 0),
+ pci_dev = pci_new_multifunction_orphan(PCI_DEVFN(FULOONG2E_VIA_SLOT, 0),
TYPE_VT82C686B_ISA);
/* Set properties on individual devices before realizing the south bridge */
@@ -312,7 +312,7 @@ static void mips_fuloong2e_init(MachineState *machine)
/* GPU */
if (vga_interface_type != VGA_NONE) {
vga_interface_created = true;
- pci_dev = pci_new(-1, "ati-vga");
+ pci_dev = pci_new_orphan(-1, "ati-vga");
dev = DEVICE(pci_dev);
qdev_prop_set_uint32(dev, "vgamem_mb", 16);
qdev_prop_set_uint16(dev, "x-device-id", 0x5159);
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index 854f7f6801..1729eb1c0b 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -465,7 +465,7 @@ static inline void loongson3_virt_devices_init(MachineState *machine,
if (defaults_enabled() && object_class_by_name("pci-ohci")) {
USBBus *usb_bus;
- pci_create_simple(pci_bus, -1, "pci-ohci");
+ pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
usb_create_simple(usb_bus, "usb-kbd");
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index fc5dbf262c..38edbbadd6 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -1233,7 +1233,7 @@ void mips_malta_init(MachineState *machine)
pci_bus_map_irqs(pci_bus, malta_pci_slot_get_pirq);
/* Southbridge */
- piix4 = pci_new_multifunction(PIIX4_PCI_DEVFN, TYPE_PIIX4_PCI_DEVICE);
+ piix4 = pci_new_multifunction_orphan(PIIX4_PCI_DEVFN, TYPE_PIIX4_PCI_DEVICE);
qdev_prop_set_uint32(DEVICE(piix4), "smb_io_base", 0x1100);
pci_realize_and_unref(piix4, pci_bus, &error_fatal);
isa_bus = ISA_BUS(qdev_get_child_bus(DEVICE(piix4), "isa.0"));
diff --git a/hw/pci-host/articia.c b/hw/pci-host/articia.c
index 04623dfd84..0556c0ccff 100644
--- a/hw/pci-host/articia.c
+++ b/hw/pci-host/articia.c
@@ -185,10 +185,10 @@ static void articia_realize(DeviceState *dev, Error **errp)
h->bus = pci_register_root_bus(dev, NULL, articia_pcihost_set_irq,
amigaone_pcihost_bus0_map_irq, dev, &s->mem,
&s->io, PCI_DEVFN(8, 0), 4, TYPE_PCI_BUS);
- pdev = pci_create_simple_multifunction(h->bus, PCI_DEVFN(0, 0),
+ pdev = pci_create_simple_multifunction_orphan(h->bus, PCI_DEVFN(0, 0),
TYPE_ARTICIA_PCI_HOST);
ARTICIA_PCI_HOST(pdev)->as = s;
- pci_create_simple(h->bus, PCI_DEVFN(0, 1), TYPE_ARTICIA_PCI_BRIDGE);
+ pci_create_simple_orphan(h->bus, PCI_DEVFN(0, 1), TYPE_ARTICIA_PCI_BRIDGE);
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->reg);
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mem);
diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c
index cd7272c90c..40a62d62b6 100644
--- a/hw/pci-host/bonito.c
+++ b/hw/pci-host/bonito.c
@@ -747,7 +747,7 @@ PCIBus *bonito_init(qemu_irq *pic)
pcihost->pic = pic;
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
- d = pci_new(PCI_DEVFN(0, 0), TYPE_PCI_BONITO);
+ d = pci_new_orphan(PCI_DEVFN(0, 0), TYPE_PCI_BONITO);
s = PCI_BONITO(d);
s->pcihost = pcihost;
pcihost->pci_dev = s;
diff --git a/hw/pci-host/grackle.c b/hw/pci-host/grackle.c
index b0db7870b0..c76cb61dc9 100644
--- a/hw/pci-host/grackle.c
+++ b/hw/pci-host/grackle.c
@@ -60,7 +60,7 @@ static void grackle_realize(DeviceState *dev, Error **errp)
&s->pci_io,
0, 4, TYPE_PCI_BUS);
- pci_create_simple(phb->bus, 0, "grackle");
+ pci_create_simple_orphan(phb->bus, 0, "grackle");
}
static void grackle_init(Object *obj)
diff --git a/hw/pci-host/gt64120.c b/hw/pci-host/gt64120.c
index 566f928304..c1a94a3daa 100644
--- a/hw/pci-host/gt64120.c
+++ b/hw/pci-host/gt64120.c
@@ -1204,7 +1204,7 @@ static void gt64120_realize(DeviceState *dev, Error **errp)
get_system_io(),
PCI_DEVFN(18, 0), TYPE_PCI_BUS);
- pci_create_simple(phb->bus, PCI_DEVFN(0, 0), "gt64120_pci");
+ pci_create_simple_orphan(phb->bus, PCI_DEVFN(0, 0), "gt64120_pci");
memory_region_init_io(&phb->conf_mem, OBJECT(phb),
&pci_host_conf_le_ops,
s, "pci-conf-idx", 4);
diff --git a/hw/pci-host/i440fx.c b/hw/pci-host/i440fx.c
index c1982f7962..e91ddd5d07 100644
--- a/hw/pci-host/i440fx.c
+++ b/hw/pci-host/i440fx.c
@@ -282,7 +282,7 @@ static void i440fx_pcihost_realize(DeviceState *dev, Error **errp)
s->io_memory, 0, TYPE_PCI_BUS);
phb->bus = b;
- d = pci_create_simple(b, 0, s->pci_type);
+ d = pci_create_simple_orphan(b, 0, s->pci_type);
f = I440FX_PCI_DEVICE(d);
range_set_bounds(&s->pci_hole, s->below_4g_mem_size,
diff --git a/hw/pci-host/mv64361.c b/hw/pci-host/mv64361.c
index 495a82befd..f75951c873 100644
--- a/hw/pci-host/mv64361.c
+++ b/hw/pci-host/mv64361.c
@@ -94,7 +94,7 @@ static void mv64361_pcihost_realize(DeviceState *dev, Error **errp)
pci_swizzle_map_irq_fn, dev,
&s->mem, &s->io, 0, 4, TYPE_PCI_BUS);
g_free(name);
- pci_create_simple(h->bus, 0, TYPE_MV64361_PCI_BRIDGE);
+ pci_create_simple_orphan(h->bus, 0, TYPE_MV64361_PCI_BRIDGE);
qdev_init_gpio_out(dev, s->irq, ARRAY_SIZE(s->irq));
}
diff --git a/hw/pci-host/pnv_phb.c b/hw/pci-host/pnv_phb.c
index 0b556d1bf5..fc0b226bef 100644
--- a/hw/pci-host/pnv_phb.c
+++ b/hw/pci-host/pnv_phb.c
@@ -167,7 +167,7 @@ static void pnv_phb_realize(DeviceState *dev, Error **errp)
}
if (defaults_enabled()) {
- PCIDevice *root = pci_new(PCI_DEVFN(0, 0), TYPE_PNV_PHB_ROOT_PORT);
+ PCIDevice *root = pci_new_orphan(PCI_DEVFN(0, 0), TYPE_PNV_PHB_ROOT_PORT);
pci_realize_and_unref(root, pci->bus, errp);
}
diff --git a/hw/pci-host/ppc4xx_pci.c b/hw/pci-host/ppc4xx_pci.c
index b9a00f5193..cd7b16aa87 100644
--- a/hw/pci-host/ppc4xx_pci.c
+++ b/hw/pci-host/ppc4xx_pci.c
@@ -332,7 +332,7 @@ static void ppc4xx_pcihost_realize(DeviceState *dev, Error **errp)
TYPE_PCI_BUS);
h->bus = b;
- pci_create_simple(b, 0, TYPE_PPC4xx_HOST_BRIDGE);
+ pci_create_simple_orphan(b, 0, TYPE_PPC4xx_HOST_BRIDGE);
/* XXX split into 2 memory regions, one for config space, one for regs */
memory_region_init(&s->container, OBJECT(s), "pci-container", PCI_ALL_SIZE);
diff --git a/hw/pci-host/ppce500.c b/hw/pci-host/ppce500.c
index 67180ba5f0..838a01608c 100644
--- a/hw/pci-host/ppce500.c
+++ b/hw/pci-host/ppce500.c
@@ -473,7 +473,7 @@ static void e500_pcihost_realize(DeviceState *dev, Error **errp)
address_space_init(&s->bm_as, &s->bm, "pci-bm");
pci_setup_iommu(b, &ppce500_iommu_ops, s);
- pci_create_simple(b, 0, TYPE_PPC_E500_PCI_BRIDGE);
+ pci_create_simple_orphan(b, 0, TYPE_PPC_E500_PCI_BRIDGE);
memory_region_init(&s->container, OBJECT(h), "pci-container", PCIE500_ALL_SIZE);
memory_region_init_io(&h->conf_mem, OBJECT(h), &pci_host_conf_be_ops, h,
diff --git a/hw/pci-host/raven.c b/hw/pci-host/raven.c
index b3836dc9a2..abcf9b28e1 100644
--- a/hw/pci-host/raven.c
+++ b/hw/pci-host/raven.c
@@ -281,7 +281,7 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)
"pci-intack", 1);
memory_region_add_subregion(address_space_mem, 0xbffffff0, &s->pci_intack);
- pci_create_simple(h->bus, PCI_DEVFN(0, 0), TYPE_RAVEN_PCI_DEVICE);
+ pci_create_simple_orphan(h->bus, PCI_DEVFN(0, 0), TYPE_RAVEN_PCI_DEVICE);
address_space_init(&s->bm_as, &s->bm, "raven-bm");
pci_setup_iommu(h->bus, &raven_iommu_ops, s);
diff --git a/hw/pci-host/sabre.c b/hw/pci-host/sabre.c
index cd2328ad53..d8c815d404 100644
--- a/hw/pci-host/sabre.c
+++ b/hw/pci-host/sabre.c
@@ -383,7 +383,7 @@ static void sabre_realize(DeviceState *dev, Error **errp)
&s->pci_ioport,
0, 0x40, TYPE_PCI_BUS);
- pci_create_simple(phb->bus, 0, TYPE_SABRE_PCI_DEVICE);
+ pci_create_simple_orphan(phb->bus, 0, TYPE_SABRE_PCI_DEVICE);
/* IOMMU */
memory_region_add_subregion_overlap(&s->sabre_config, 0x200,
@@ -391,12 +391,12 @@ static void sabre_realize(DeviceState *dev, Error **errp)
pci_setup_iommu(phb->bus, &sabre_iommu_ops, s->iommu);
/* APB secondary busses */
- pci_dev = pci_new_multifunction(PCI_DEVFN(1, 0), TYPE_SIMBA_PCI_BRIDGE);
+ pci_dev = pci_new_multifunction_orphan(PCI_DEVFN(1, 0), TYPE_SIMBA_PCI_BRIDGE);
s->bridgeB = PCI_BRIDGE(pci_dev);
pci_bridge_map_irq(s->bridgeB, "pciB", pci_simbaB_map_irq);
pci_realize_and_unref(pci_dev, phb->bus, &error_fatal);
- pci_dev = pci_new_multifunction(PCI_DEVFN(1, 1), TYPE_SIMBA_PCI_BRIDGE);
+ pci_dev = pci_new_multifunction_orphan(PCI_DEVFN(1, 1), TYPE_SIMBA_PCI_BRIDGE);
s->bridgeA = PCI_BRIDGE(pci_dev);
pci_bridge_map_irq(s->bridgeA, "pciA", pci_simbaA_map_irq);
pci_realize_and_unref(pci_dev, phb->bus, &error_fatal);
diff --git a/hw/pci-host/sh_pci.c b/hw/pci-host/sh_pci.c
index 3ffd2cdbd7..749b9d76a1 100644
--- a/hw/pci-host/sh_pci.c
+++ b/hw/pci-host/sh_pci.c
@@ -142,7 +142,7 @@ static void sh_pcic_host_realize(DeviceState *dev, Error **errp)
sysbus_init_mmio(sbd, &s->memconfig_a7);
memory_region_add_subregion(get_system_memory(), 0xfe240000, &s->isa);
- s->dev = pci_create_simple(phb->bus, PCI_DEVFN(0, 0), "sh_pci_host");
+ s->dev = pci_create_simple_orphan(phb->bus, PCI_DEVFN(0, 0), "sh_pci_host");
}
static void sh_pcic_pci_realize(PCIDevice *d, Error **errp)
diff --git a/hw/pci-host/uninorth.c b/hw/pci-host/uninorth.c
index 10972de694..4590687bd3 100644
--- a/hw/pci-host/uninorth.c
+++ b/hw/pci-host/uninorth.c
@@ -126,7 +126,7 @@ static void pci_unin_main_realize(DeviceState *dev, Error **errp)
&s->pci_io,
PCI_DEVFN(11, 0), 4, TYPE_PCI_BUS);
- pci_create_simple(h->bus, PCI_DEVFN(11, 0), "uni-north-pci");
+ pci_create_simple_orphan(h->bus, PCI_DEVFN(11, 0), "uni-north-pci");
/*
* DEC 21154 bridge was unused for many years, this comment is
@@ -176,7 +176,7 @@ static void pci_u3_agp_realize(DeviceState *dev, Error **errp)
&s->pci_io,
PCI_DEVFN(11, 0), 4, TYPE_PCI_BUS);
- pci_create_simple(h->bus, PCI_DEVFN(11, 0), "u3-agp");
+ pci_create_simple_orphan(h->bus, PCI_DEVFN(11, 0), "u3-agp");
}
static void pci_u3_agp_init(Object *obj)
@@ -220,7 +220,7 @@ static void pci_unin_agp_realize(DeviceState *dev, Error **errp)
&s->pci_io,
PCI_DEVFN(11, 0), 4, TYPE_PCI_BUS);
- pci_create_simple(h->bus, PCI_DEVFN(11, 0), "uni-north-agp");
+ pci_create_simple_orphan(h->bus, PCI_DEVFN(11, 0), "uni-north-agp");
}
static void pci_unin_agp_init(Object *obj)
@@ -253,7 +253,7 @@ static void pci_unin_internal_realize(DeviceState *dev, Error **errp)
&s->pci_io,
PCI_DEVFN(14, 0), 4, TYPE_PCI_BUS);
- pci_create_simple(h->bus, PCI_DEVFN(14, 0), "uni-north-internal-pci");
+ pci_create_simple_orphan(h->bus, PCI_DEVFN(14, 0), "uni-north-internal-pci");
}
static void pci_unin_internal_init(Object *obj)
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index d14fc6478e..61b9f2a230 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -2118,7 +2118,7 @@ bool pci_init_nic_in_slot(PCIBus *rootbus, const char *model,
exit(1);
}
- pci_dev = pci_new(devfn, model);
+ pci_dev = pci_new_orphan(devfn, model);
qdev_set_nic_properties(&pci_dev->qdev, nd);
pci_realize_and_unref(pci_dev, bus, &error_fatal);
return true;
@@ -2129,15 +2129,15 @@ PCIDevice *pci_vga_init(PCIBus *bus)
vga_interface_created = true;
switch (vga_interface_type) {
case VGA_CIRRUS:
- return pci_create_simple(bus, -1, "cirrus-vga");
+ return pci_create_simple_orphan(bus, -1, "cirrus-vga");
case VGA_QXL:
- return pci_create_simple(bus, -1, "qxl-vga");
+ return pci_create_simple_orphan(bus, -1, "qxl-vga");
case VGA_STD:
- return pci_create_simple(bus, -1, "VGA");
+ return pci_create_simple_orphan(bus, -1, "VGA");
case VGA_VMWARE:
- return pci_create_simple(bus, -1, "vmware-svga");
+ return pci_create_simple_orphan(bus, -1, "vmware-svga");
case VGA_VIRTIO:
- return pci_create_simple(bus, -1, "virtio-vga");
+ return pci_create_simple_orphan(bus, -1, "virtio-vga");
case VGA_NONE:
default: /* Other non-PCI types. Checking for unsupported types is already
done in vl.c. */
@@ -2399,12 +2399,53 @@ static PCIDevice *pci_new_internal(int devfn, bool multifunction,
return PCI_DEVICE(dev);
}
-PCIDevice *pci_new_multifunction(int devfn, const char *name)
+static PCIDevice *pci_new_child_internal(Object *parent, const char *id,
+ int devfn, bool multifunction,
+ const char *type)
+{
+ DeviceState *dev;
+
+ dev = qdev_new(parent, id, type);
+ qdev_prop_set_int32(dev, "addr", devfn);
+ qdev_prop_set_bit(dev, "multifunction", multifunction);
+ return PCI_DEVICE(dev);
+}
+
+PCIDevice *pci_new_multifunction(Object *parent, const char *id,
+ int devfn, const char *type)
+{
+ return pci_new_child_internal(parent, id, devfn, true, type);
+}
+
+PCIDevice *pci_new(Object *parent, const char *id,
+ int devfn, const char *type)
+{
+ return pci_new_child_internal(parent, id, devfn, false, type);
+}
+
+PCIDevice *pci_create_simple_multifunction(Object *parent, const char *id,
+ PCIBus *bus, int devfn,
+ const char *type)
+{
+ PCIDevice *dev = pci_new_multifunction(parent, id, devfn, type);
+ qdev_realize(DEVICE(dev), BUS(bus), &error_fatal);
+ return dev;
+}
+
+PCIDevice *pci_create_simple(Object *parent, const char *id,
+ PCIBus *bus, int devfn, const char *type)
+{
+ PCIDevice *dev = pci_new(parent, id, devfn, type);
+ qdev_realize(DEVICE(dev), BUS(bus), &error_fatal);
+ return dev;
+}
+
+PCIDevice *pci_new_multifunction_orphan(int devfn, const char *name)
{
return pci_new_internal(devfn, true, name);
}
-PCIDevice *pci_new(int devfn, const char *name)
+PCIDevice *pci_new_orphan(int devfn, const char *name)
{
return pci_new_internal(devfn, false, name);
}
@@ -2414,17 +2455,17 @@ bool pci_realize_and_unref(PCIDevice *dev, PCIBus *bus, Error **errp)
return qdev_realize_and_unref(&dev->qdev, &bus->qbus, errp);
}
-PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn,
+PCIDevice *pci_create_simple_multifunction_orphan(PCIBus *bus, int devfn,
const char *name)
{
- PCIDevice *dev = pci_new_multifunction(devfn, name);
+ PCIDevice *dev = pci_new_multifunction_orphan(devfn, name);
pci_realize_and_unref(dev, bus, &error_fatal);
return dev;
}
-PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name)
+PCIDevice *pci_create_simple_orphan(PCIBus *bus, int devfn, const char *name)
{
- PCIDevice *dev = pci_new(devfn, name);
+ PCIDevice *dev = pci_new_orphan(devfn, name);
pci_realize_and_unref(dev, bus, &error_fatal);
return dev;
}
diff --git a/hw/pci/pcie_sriov.c b/hw/pci/pcie_sriov.c
index c41ac95bee..a69a41cdde 100644
--- a/hw/pci/pcie_sriov.c
+++ b/hw/pci/pcie_sriov.c
@@ -171,7 +171,7 @@ bool pcie_sriov_pf_init(PCIDevice *dev, uint16_t offset,
dev->exp.sriov_pf.vf = g_new(PCIDevice *, total_vfs);
for (uint16_t i = 0; i < total_vfs; i++) {
- PCIDevice *vf = pci_new(devfn, vfname);
+ PCIDevice *vf = pci_new_orphan(devfn, vfname);
vf->exp.sriov_vf.pf = dev;
vf->exp.sriov_vf.vf_number = i;
diff --git a/hw/ppc/amigaone.c b/hw/ppc/amigaone.c
index 528c2c656a..c6b331ff16 100644
--- a/hw/ppc/amigaone.c
+++ b/hw/ppc/amigaone.c
@@ -355,7 +355,7 @@ static void amigaone_init(MachineState *machine)
pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci.0"));
/* VIA VT82c686B South Bridge (multifunction PCI device) */
- via = OBJECT(pci_create_simple_multifunction(pci_bus, PCI_DEVFN(7, 0),
+ via = OBJECT(pci_create_simple_multifunction_orphan(pci_bus, PCI_DEVFN(7, 0),
TYPE_VT82C686B_ISA));
object_property_add_alias(OBJECT(machine), "rtc-time",
object_resolve_path_component(via, "rtc"),
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index 31dda69127..0df953b9e1 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -348,7 +348,7 @@ static void ppc_core99_init(MachineState *machine)
pci_bus = PCI_HOST_BRIDGE(uninorth_pci_dev)->bus;
/* MacIO */
- macio = OBJECT(pci_new(-1, TYPE_NEWWORLD_MACIO));
+ macio = OBJECT(pci_new_orphan(-1, TYPE_NEWWORLD_MACIO));
dev = DEVICE(macio);
qdev_prop_set_uint64(dev, "frequency", tbfreq);
qdev_prop_set_bit(dev, "has-pmu", has_pmu);
@@ -416,7 +416,7 @@ static void ppc_core99_init(MachineState *machine)
}
if (machine->usb) {
- pci_create_simple(pci_bus, -1, "pci-ohci");
+ pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
/* U3 needs to use USB for input because Linux doesn't support via-cuda
on PPC64 */
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index aa366ca190..e6c5830c38 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -229,7 +229,7 @@ static void ppc_heathrow_init(MachineState *machine)
pci_bus = PCI_HOST_BRIDGE(grackle_dev)->bus;
/* MacIO */
- macio = OBJECT(pci_new(PCI_DEVFN(16, 0), TYPE_OLDWORLD_MACIO));
+ macio = OBJECT(pci_new_orphan(PCI_DEVFN(16, 0), TYPE_OLDWORLD_MACIO));
qdev_prop_set_uint64(DEVICE(macio), "frequency", tbfreq);
dev = DEVICE(object_resolve_path_component(macio, "escc"));
@@ -285,7 +285,7 @@ static void ppc_heathrow_init(MachineState *machine)
qdev_realize_and_unref(dev, adb_bus, &error_fatal);
if (machine_usb(machine)) {
- pci_create_simple(pci_bus, -1, "pci-ohci");
+ pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
}
if (!graphic_width) {
diff --git a/hw/ppc/pegasos.c b/hw/ppc/pegasos.c
index 3dc02423ee..0030068ab3 100644
--- a/hw/ppc/pegasos.c
+++ b/hw/ppc/pegasos.c
@@ -241,7 +241,7 @@ static void pegasos_init(MachineState *machine)
/* VIA VT8231 South Bridge (multifunction PCI device) */
devfn = PCI_DEVFN(pm->type == PEGASOS1 ? 7 : 12, 0);
- pm->sb = DEVICE(pci_new_multifunction(devfn, TYPE_VT8231_ISA));
+ pm->sb = DEVICE(pci_new_multifunction_orphan(devfn, TYPE_VT8231_ISA));
via = OBJECT(pm->sb);
/* Set properties on individual devices before realizing the south bridge */
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index f53ff9c582..a716d5da6a 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -300,7 +300,7 @@ static void ibm_40p_init(MachineState *machine)
}
/* PCI -> ISA bridge */
- i82378_dev = DEVICE(pci_new(PCI_DEVFN(11, 0), "i82378"));
+ i82378_dev = DEVICE(pci_new_orphan(PCI_DEVFN(11, 0), "i82378"));
qdev_realize_and_unref(i82378_dev, BUS(pci_bus), &error_fatal);
qdev_connect_gpio_out(i82378_dev, 0,
qdev_get_gpio_in(DEVICE(cpu), PPC6xx_INPUT_INT));
@@ -350,7 +350,7 @@ static void ibm_40p_init(MachineState *machine)
qdev_prop_set_uint32(dev, "config", 12);
isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
- dev = DEVICE(pci_create_simple(pci_bus, PCI_DEVFN(1, 0), "lsi53c810"));
+ dev = DEVICE(pci_create_simple_orphan(pci_bus, PCI_DEVFN(1, 0), "lsi53c810"));
lsi53c8xx_handle_legacy_cmdline(dev);
qdev_connect_gpio_out(dev, 0, qdev_get_gpio_in(i82378_dev, 13));
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 88c4e66b2d..0c4c6f6256 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -422,14 +422,14 @@ static void sam460ex_init(MachineState *machine)
pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci.0"));
/* PCI devices */
- pci_create_simple(pci_bus, PCI_DEVFN(6, 0), "sm501");
+ pci_create_simple_orphan(pci_bus, PCI_DEVFN(6, 0), "sm501");
/*
* SoC has a single SATA port but we don't emulate that
* However, firmware and usual clients have driver for SiI311x
* PCI SATA card so add one for convenience by default
*/
if (defaults_enabled()) {
- PCIIDEState *s = PCI_IDE(pci_create_simple(pci_bus, -1, "sii3112"));
+ PCIIDEState *s = PCI_IDE(pci_create_simple_orphan(pci_bus, -1, "sii3112"));
DriveInfo *di;
di = drive_get_by_index(IF_IDE, 0);
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 30bf0cd0c0..4ead6ba664 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -3075,7 +3075,7 @@ static void spapr_machine_init(MachineState *machine)
}
if (machine->usb) {
- pci_create_simple(phb->bus, -1, "nec-usb-xhci");
+ pci_create_simple_orphan(phb->bus, -1, "nec-usb-xhci");
if (has_vga) {
USBBus *usb_bus;
diff --git a/hw/riscv/boston-aia.c b/hw/riscv/boston-aia.c
index 0fbb44c5df..029cf23696 100644
--- a/hw/riscv/boston-aia.c
+++ b/hw/riscv/boston-aia.c
@@ -418,7 +418,7 @@ static void boston_mach_init(MachineState *machine)
qemu_chr_fe_set_handlers(&s->lcd_display, NULL, NULL,
boston_lcd_event, NULL, s, NULL, true);
- pdev = pci_create_simple_multifunction(&PCI_BRIDGE(&pcie2->root)->sec_bus,
+ pdev = pci_create_simple_multifunction_orphan(&PCI_BRIDGE(&pcie2->root)->sec_bus,
PCI_DEVFN(0, 0), TYPE_ICH9_AHCI);
ich9 = ICH9_AHCI(pdev);
g_assert(ARRAY_SIZE(hd) == ich9->ahci.ports);
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index bd73d26e2c..5de873126c 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -599,7 +599,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
pci_bus_set_slot_reserved_mask(pci_busA, 0xfffffff1);
pci_bus_set_slot_reserved_mask(pci_busB, 0xfffffff0);
- ebus = pci_new_multifunction(PCI_DEVFN(1, 0), TYPE_EBUS);
+ ebus = pci_new_multifunction_orphan(PCI_DEVFN(1, 0), TYPE_EBUS);
qdev_prop_set_uint64(DEVICE(ebus), "console-serial-base",
hwdef->console_serial_base);
pci_realize_and_unref(ebus, pci_busA, &error_fatal);
@@ -618,7 +618,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
switch (vga_interface_type) {
case VGA_STD:
- pci_create_simple(pci_busA, PCI_DEVFN(2, 0), "VGA");
+ pci_create_simple_orphan(pci_busA, PCI_DEVFN(2, 0), "VGA");
vga_interface_created = true;
break;
case VGA_NONE:
@@ -632,7 +632,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
nd = qemu_find_nic_info(mc->default_nic, true, NULL);
if (nd) {
- pci_dev = pci_new_multifunction(PCI_DEVFN(1, 1), mc->default_nic);
+ pci_dev = pci_new_multifunction_orphan(PCI_DEVFN(1, 1), mc->default_nic);
dev = &pci_dev->qdev;
qdev_set_nic_properties(dev, nd);
pci_realize_and_unref(pci_dev, pci_busA, &error_fatal);
@@ -648,7 +648,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
qemu_macaddr_default_if_unset(&macaddr);
}
- pci_dev = pci_new(PCI_DEVFN(3, 0), "cmd646-ide");
+ pci_dev = pci_new_orphan(PCI_DEVFN(3, 0), "cmd646-ide");
qdev_prop_set_uint32(&pci_dev->qdev, "secondary", 1);
pci_realize_and_unref(pci_dev, pci_busA, &error_fatal);
pci_ide_create_devs(pci_dev);
diff --git a/hw/vfio/igd.c b/hw/vfio/igd.c
index e091f21b6a..bea0d57a11 100644
--- a/hw/vfio/igd.c
+++ b/hw/vfio/igd.c
@@ -334,7 +334,7 @@ static int vfio_pci_igd_lpc_init(VFIOPCIDevice *vdev,
lpc_bridge = pci_find_device(pci_device_root_bus(pdev),
0, PCI_DEVFN(0x1f, 0));
if (!lpc_bridge) {
- lpc_bridge = pci_create_simple(pci_device_root_bus(pdev),
+ lpc_bridge = pci_create_simple_orphan(pci_device_root_bus(pdev),
PCI_DEVFN(0x1f, 0), "vfio-pci-igd-lpc-bridge");
}
diff --git a/hw/xen/xen_pt_graphics.c b/hw/xen/xen_pt_graphics.c
index 7df9344500..4457209e83 100644
--- a/hw/xen/xen_pt_graphics.c
+++ b/hw/xen/xen_pt_graphics.c
@@ -399,7 +399,7 @@ void xen_igd_passthrough_isa_bridge_create(XenPCIPassthroughState *s,
}
/* Currently IGD drivers always need to access PCH by 1f.0. */
- bridge_dev = pci_create_simple(bus, PCI_DEVFN(0x1f, 0),
+ bridge_dev = pci_create_simple_orphan(bus, PCI_DEVFN(0x1f, 0),
"igd-passthrough-isa-bridge");
/*
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index f2448e941a..cbbb6a3756 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -1088,13 +1088,23 @@ pci_set_quad_by_mask(uint8_t *config, uint64_t mask, uint64_t reg)
pci_set_quad(config, (~mask & val) | (mask & rval));
}
-PCIDevice *pci_new_multifunction(int devfn, const char *name);
-PCIDevice *pci_new(int devfn, const char *name);
+PCIDevice *pci_new_multifunction(Object *parent, const char *id,
+ int devfn, const char *type);
+PCIDevice *pci_new(Object *parent, const char *id,
+ int devfn, const char *type);
+PCIDevice *pci_create_simple_multifunction(Object *parent, const char *id,
+ PCIBus *bus, int devfn,
+ const char *type);
+PCIDevice *pci_create_simple(Object *parent, const char *id,
+ PCIBus *bus, int devfn, const char *type);
+
+PCIDevice *pci_new_multifunction_orphan(int devfn, const char *name);
+PCIDevice *pci_new_orphan(int devfn, const char *name);
bool pci_realize_and_unref(PCIDevice *dev, PCIBus *bus, Error **errp);
-PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn,
+PCIDevice *pci_create_simple_multifunction_orphan(PCIBus *bus, int devfn,
const char *name);
-PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name);
+PCIDevice *pci_create_simple_orphan(PCIBus *bus, int devfn, const char *name);
void lsi53c8xx_handle_legacy_cmdline(DeviceState *lsi_dev);
diff --git a/scripts/coccinelle/qom-parent/pci-new-orphan.cocci b/scripts/coccinelle/qom-parent/pci-new-orphan.cocci
new file mode 100644
index 0000000000..e6cfd0d6c1
--- /dev/null
+++ b/scripts/coccinelle/qom-parent/pci-new-orphan.cocci
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+//
+// Rename pci_new*/pci_create_simple*() to *_orphan() so that the
+// short names can be reintroduced with a mandatory (parent, id, ...)
+// signature.
+//
+// spatch --sp-file scripts/coccinelle/qom-parent/pci-new-orphan.cocci \
+// --in-place --include-headers --dir .
+
+@@
+@@
+- pci_new_multifunction
++ pci_new_multifunction_orphan
+
+@@
+@@
+- pci_new
++ pci_new_orphan
+
+@@
+@@
+- pci_create_simple_multifunction
++ pci_create_simple_multifunction_orphan
+
+@@
+@@
+- pci_create_simple
++ pci_create_simple_orphan
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 006/134] isa: Make isa_new()/isa_try_new()/isa_create_simple() take a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (4 preceding siblings ...)
2026-07-11 22:34 ` [RFC PATCH 005/134] pci: Make pci_new*()/pci_create_simple*() " Alexander Graf
@ 2026-07-11 22:34 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 007/134] i2c: Make i2c_slave_new()/i2c_slave_create_simple() " Alexander Graf
` (128 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:34 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Same rename-and-reintroduce treatment as the qdev, sysbus and PCI
layers: mechanically rename the three ISA creation helpers to
*_orphan() and reintroduce the short names with a leading
(parent, id, ...) pair.
The parented isa_create_simple() calls qdev_realize() (not
isa_realize_and_unref()) since the child<> property already holds
the sole reference.
The mechanical rename part is generated by
spatch --sp-file scripts/coccinelle/qom-parent/isa-new-orphan.cocci \
--in-place --include-headers --dir .
or equivalently
git ls-files '*.[ch]' '*.[ch].inc' '*.rst' '*.py' | \
grep -v '^subprojects/' | \
xargs sed -i \
's/\bisa_create_simple\b/&_orphan/g;
s/\bisa_try_new\b/&_orphan/g;
s/\bisa_new\b/&_orphan/g'
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/alpha/dp264.c | 2 +-
hw/char/parallel-isa.c | 2 +-
hw/char/serial-isa.c | 2 +-
hw/dma/i8257.c | 4 +--
hw/i386/isapc.c | 2 +-
hw/i386/pc.c | 12 ++++----
hw/ide/isa.c | 2 +-
hw/intc/i8259_common.c | 2 +-
hw/isa/i82378.c | 4 +--
hw/isa/isa-bus.c | 30 +++++++++++++++----
hw/isa/isa-superio.c | 10 +++----
hw/mips/jazz.c | 2 +-
hw/mips/malta.c | 2 +-
hw/ppc/pnv.c | 2 +-
hw/ppc/prep.c | 12 ++++----
hw/rtc/mc146818rtc.c | 2 +-
hw/sparc64/sun4u.c | 4 +--
include/hw/i386/vmport.h | 2 +-
include/hw/isa/isa.h | 10 +++++--
include/hw/net/ne2000-isa.h | 2 +-
include/hw/timer/i8254.h | 4 +--
.../qom-parent/isa-new-orphan.cocci | 23 ++++++++++++++
22 files changed, 91 insertions(+), 46 deletions(-)
create mode 100644 scripts/coccinelle/qom-parent/isa-new-orphan.cocci
diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index 6999168df6..b07dcebaa0 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -126,7 +126,7 @@ static void clipper_init(MachineState *machine)
pci_init_nic_devices(pci_bus, mc->default_nic);
/* Super I/O */
- isa_create_simple(isa_bus, TYPE_SMC37C669_SUPERIO);
+ isa_create_simple_orphan(isa_bus, TYPE_SMC37C669_SUPERIO);
/* IDE disk setup. */
pci_dev = pci_create_simple_orphan(pci_bus, -1, "cmd646-ide");
diff --git a/hw/char/parallel-isa.c b/hw/char/parallel-isa.c
index 92e94138f4..19583c0f23 100644
--- a/hw/char/parallel-isa.c
+++ b/hw/char/parallel-isa.c
@@ -22,7 +22,7 @@ static void parallel_init(ISABus *bus, int index, Chardev *chr)
DeviceState *dev;
ISADevice *isadev;
- isadev = isa_new(TYPE_ISA_PARALLEL);
+ isadev = isa_new_orphan(TYPE_ISA_PARALLEL);
dev = DEVICE(isadev);
qdev_prop_set_uint32(dev, "index", index);
qdev_prop_set_chr(dev, "chardev", chr);
diff --git a/hw/char/serial-isa.c b/hw/char/serial-isa.c
index eaa4e843c0..4dbdc0df91 100644
--- a/hw/char/serial-isa.c
+++ b/hw/char/serial-isa.c
@@ -165,7 +165,7 @@ static void serial_isa_init(ISABus *bus, int index, Chardev *chr)
DeviceState *dev;
ISADevice *isadev;
- isadev = isa_new(TYPE_ISA_SERIAL);
+ isadev = isa_new_orphan(TYPE_ISA_SERIAL);
dev = DEVICE(isadev);
qdev_prop_set_uint32(dev, "index", index);
qdev_prop_set_chr(dev, "chardev", chr);
diff --git a/hw/dma/i8257.c b/hw/dma/i8257.c
index 5771549889..d1ab17b80d 100644
--- a/hw/dma/i8257.c
+++ b/hw/dma/i8257.c
@@ -651,7 +651,7 @@ void i8257_dma_init(Object *parent, ISABus *bus, bool high_page_enable)
ISADevice *isa1, *isa2;
DeviceState *d;
- isa1 = isa_new(TYPE_I8257);
+ isa1 = isa_new_orphan(TYPE_I8257);
object_property_add_child(parent, "dma[*]", OBJECT(isa1));
d = DEVICE(isa1);
qdev_prop_set_int32(d, "base", 0x00);
@@ -660,7 +660,7 @@ void i8257_dma_init(Object *parent, ISABus *bus, bool high_page_enable)
qdev_prop_set_int32(d, "dshift", 0);
isa_realize_and_unref(isa1, bus, &error_fatal);
- isa2 = isa_new(TYPE_I8257);
+ isa2 = isa_new_orphan(TYPE_I8257);
object_property_add_child(parent, "dma[*]", OBJECT(isa2));
d = DEVICE(isa2);
qdev_prop_set_int32(d, "base", 0xc0);
diff --git a/hw/i386/isapc.c b/hw/i386/isapc.c
index 1ba9ae22cc..03d68f748f 100644
--- a/hw/i386/isapc.c
+++ b/hw/i386/isapc.c
@@ -112,7 +112,7 @@ static void pc_init_isa(MachineState *machine)
&error_abort);
isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
- x86ms->rtc = isa_new(TYPE_MC146818_RTC);
+ x86ms->rtc = isa_new_orphan(TYPE_MC146818_RTC);
qdev_prop_set_int32(DEVICE(x86ms->rtc), "base_year", 2000);
isa_realize_and_unref(x86ms->rtc, isa_bus, &error_fatal);
irq = object_property_get_uint(OBJECT(x86ms->rtc), "irq",
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 11a9d5df97..905b4960a3 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -998,7 +998,7 @@ static void pc_superio_init(ISABus *isa_bus, bool create_fdctrl,
}
if (create_fdctrl) {
#ifdef CONFIG_FDC_ISA
- ISADevice *fdc = isa_new(TYPE_ISA_FDC);
+ ISADevice *fdc = isa_new_orphan(TYPE_ISA_FDC);
if (fdc) {
isa_realize_and_unref(fdc, isa_bus, &error_fatal);
isa_fdc_init_drives(fdc, fd);
@@ -1014,10 +1014,10 @@ static void pc_superio_init(ISABus *isa_bus, bool create_fdctrl,
return;
}
- i8042 = isa_create_simple(isa_bus, TYPE_I8042);
+ i8042 = isa_create_simple_orphan(isa_bus, TYPE_I8042);
if (!no_vmport) {
- isa_create_simple(isa_bus, TYPE_VMPORT);
- vmmouse = isa_try_new("vmmouse");
+ isa_create_simple_orphan(isa_bus, TYPE_VMPORT);
+ vmmouse = isa_try_new_orphan("vmmouse");
} else {
vmmouse = NULL;
}
@@ -1026,7 +1026,7 @@ static void pc_superio_init(ISABus *isa_bus, bool create_fdctrl,
&error_abort);
isa_realize_and_unref(vmmouse, isa_bus, &error_fatal);
}
- port92 = isa_create_simple(isa_bus, TYPE_PORT92);
+ port92 = isa_create_simple_orphan(isa_bus, TYPE_PORT92);
a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2);
qdev_connect_gpio_out_named(DEVICE(i8042),
@@ -1639,7 +1639,7 @@ static void pc_machine_initfn(Object *obj)
pcms->default_bus_bypass_iommu = false;
pc_system_flash_create(pcms);
- pcms->pcspk = isa_new(TYPE_PC_SPEAKER);
+ pcms->pcspk = isa_new_orphan(TYPE_PC_SPEAKER);
object_property_add_alias(OBJECT(pcms), "pcspk-audiodev",
OBJECT(pcms->pcspk), "audiodev");
if (pcmc->pci_enabled) {
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index c97b7a1ff4..c9c997344b 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -84,7 +84,7 @@ ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int irqnum,
ISADevice *isadev;
ISAIDEState *s;
- isadev = isa_new(TYPE_ISA_IDE);
+ isadev = isa_new_orphan(TYPE_ISA_IDE);
dev = DEVICE(isadev);
qdev_prop_set_uint32(dev, "iobase", iobase);
qdev_prop_set_uint32(dev, "iobase2", iobase2);
diff --git a/hw/intc/i8259_common.c b/hw/intc/i8259_common.c
index 8ceb5841b9..45eb0e14a8 100644
--- a/hw/intc/i8259_common.c
+++ b/hw/intc/i8259_common.c
@@ -94,7 +94,7 @@ ISADevice *i8259_init_chip(const char *name, ISABus *bus, bool master)
DeviceState *dev;
ISADevice *isadev;
- isadev = isa_new(name);
+ isadev = isa_new_orphan(name);
dev = DEVICE(isadev);
qdev_prop_set_uint32(dev, "iobase", master ? 0x20 : 0xa0);
qdev_prop_set_uint32(dev, "elcr_addr", master ? 0x4d0 : 0x4d1);
diff --git a/hw/isa/i82378.c b/hw/isa/i82378.c
index dfa8a3775c..63d4050db2 100644
--- a/hw/isa/i82378.c
+++ b/hw/isa/i82378.c
@@ -103,14 +103,14 @@ static void i82378_realize(PCIDevice *pci, Error **errp)
pit = i8254_pit_init(isabus, 0x40, 0, NULL);
/* speaker */
- pcspk = isa_new(TYPE_PC_SPEAKER);
+ pcspk = isa_new_orphan(TYPE_PC_SPEAKER);
object_property_set_link(OBJECT(pcspk), "pit", OBJECT(pit), &error_fatal);
if (!isa_realize_and_unref(pcspk, isabus, errp)) {
return;
}
/* 2 82C37 (dma) */
- isa_create_simple(isabus, "i82374");
+ isa_create_simple_orphan(isabus, "i82374");
}
static void i82378_init(Object *obj)
diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c
index 5e6340f635..c15cf53469 100644
--- a/hw/isa/isa-bus.c
+++ b/hw/isa/isa-bus.c
@@ -153,21 +153,39 @@ int isa_register_portio_list(ISADevice *dev,
return 0;
}
-ISADevice *isa_new(const char *name)
+ISADevice *isa_new(Object *parent, const char *id, const char *type)
+{
+ return ISA_DEVICE(qdev_new(parent, id, type));
+}
+
+ISADevice *isa_try_new(Object *parent, const char *id, const char *type)
+{
+ return ISA_DEVICE(qdev_try_new(parent, id, type));
+}
+
+ISADevice *isa_create_simple(Object *parent, const char *id,
+ ISABus *bus, const char *type)
+{
+ ISADevice *dev = isa_new(parent, id, type);
+ qdev_realize(DEVICE(dev), BUS(bus), &error_fatal);
+ return dev;
+}
+
+ISADevice *isa_new_orphan(const char *name)
{
return ISA_DEVICE(qdev_new_orphan(name));
}
-ISADevice *isa_try_new(const char *name)
+ISADevice *isa_try_new_orphan(const char *name)
{
return ISA_DEVICE(qdev_try_new_orphan(name));
}
-ISADevice *isa_create_simple(ISABus *bus, const char *name)
+ISADevice *isa_create_simple_orphan(ISABus *bus, const char *name)
{
ISADevice *dev;
- dev = isa_new(name);
+ dev = isa_new_orphan(name);
isa_realize_and_unref(dev, bus, &error_fatal);
return dev;
}
@@ -187,12 +205,12 @@ ISADevice *isa_vga_init(ISABus *bus)
vga_interface_created = true;
switch (vga_interface_type) {
case VGA_CIRRUS:
- return isa_create_simple(bus, "isa-cirrus-vga");
+ return isa_create_simple_orphan(bus, "isa-cirrus-vga");
case VGA_QXL:
error_report("%s: qxl: no PCI bus", __func__);
return NULL;
case VGA_STD:
- return isa_create_simple(bus, "isa-vga");
+ return isa_create_simple_orphan(bus, "isa-vga");
case VGA_VMWARE:
error_report("%s: vmware_vga: no PCI bus", __func__);
return NULL;
diff --git a/hw/isa/isa-superio.c b/hw/isa/isa-superio.c
index dc6ae3cb10..2d65255f34 100644
--- a/hw/isa/isa-superio.c
+++ b/hw/isa/isa-superio.c
@@ -54,7 +54,7 @@ static void isa_superio_realize(DeviceState *dev, Error **errp)
} else {
name = g_strdup_printf("parallel%d", i);
}
- isa = isa_new(TYPE_ISA_PARALLEL);
+ isa = isa_new_orphan(TYPE_ISA_PARALLEL);
d = DEVICE(isa);
qdev_prop_set_uint32(d, "index", i);
if (k->parallel.get_iobase) {
@@ -93,7 +93,7 @@ static void isa_superio_realize(DeviceState *dev, Error **errp)
} else {
name = g_strdup_printf("serial%d", i);
}
- isa = isa_new(TYPE_ISA_SERIAL);
+ isa = isa_new_orphan(TYPE_ISA_SERIAL);
d = DEVICE(isa);
qdev_prop_set_uint32(d, "index", i);
if (k->serial.get_iobase) {
@@ -120,7 +120,7 @@ static void isa_superio_realize(DeviceState *dev, Error **errp)
assert(k->floppy.count <= 1);
if (k->floppy.count &&
(!k->floppy.is_enabled || k->floppy.is_enabled(sio, 0))) {
- isa = isa_new(TYPE_ISA_FDC);
+ isa = isa_new_orphan(TYPE_ISA_FDC);
d = DEVICE(isa);
if (k->floppy.get_iobase) {
qdev_prop_set_uint32(d, "iobase", k->floppy.get_iobase(sio, 0));
@@ -144,14 +144,14 @@ static void isa_superio_realize(DeviceState *dev, Error **errp)
}
/* Keyboard, mouse */
- isa = isa_new(TYPE_I8042);
+ isa = isa_new_orphan(TYPE_I8042);
object_property_add_child(OBJECT(sio), TYPE_I8042, OBJECT(isa));
isa_realize_and_unref(isa, bus, &error_fatal);
sio->kbc = isa;
/* IDE */
if (k->ide.count && (!k->ide.is_enabled || k->ide.is_enabled(sio, 0))) {
- isa = isa_new("isa-ide");
+ isa = isa_new_orphan("isa-ide");
d = DEVICE(isa);
if (k->ide.get_iobase) {
qdev_prop_set_uint32(d, "iobase", k->ide.get_iobase(sio, 0));
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index a902e400cf..849c97eb10 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -289,7 +289,7 @@ static void mips_jazz_init(MachineState *machine,
isa_bus_register_input_irqs(isa_bus, i8259);
i8257_dma_init(OBJECT(rc4030), isa_bus, 0);
pit = i8254_pit_init(isa_bus, 0x40, 0, NULL);
- pcspk = isa_new(TYPE_PC_SPEAKER);
+ pcspk = isa_new_orphan(TYPE_PC_SPEAKER);
object_property_set_link(OBJECT(pcspk), "pit", OBJECT(pit), &error_fatal);
isa_realize_and_unref(pcspk, isa_bus, &error_fatal);
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index 38edbbadd6..da6dd15a59 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -1253,7 +1253,7 @@ void mips_malta_init(MachineState *machine)
g_free(smbus_eeprom_buf);
/* Super I/O: SMS FDC37M817 */
- isa_create_simple(isa_bus, TYPE_FDC37M81X_SUPERIO);
+ isa_create_simple_orphan(isa_bus, TYPE_FDC37M81X_SUPERIO);
/* Network card */
network_init(pci_bus);
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index b85b6dd46c..8346613a68 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1010,7 +1010,7 @@ static bool pnv_match_cpu(const char *default_type, const char *cpu_type)
static void pnv_ipmi_bt_init(ISABus *bus, IPMIBmc *bmc, uint32_t irq)
{
- ISADevice *dev = isa_new("isa-ipmi-bt");
+ ISADevice *dev = isa_new_orphan("isa-ipmi-bt");
object_property_set_link(OBJECT(dev), "bmc", OBJECT(bmc), &error_fatal);
object_property_set_int(OBJECT(dev), "irq", irq, &error_fatal);
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index a716d5da6a..32a28bc12a 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -309,20 +309,20 @@ static void ibm_40p_init(MachineState *machine)
isa_bus = ISA_BUS(qdev_get_child_bus(i82378_dev, "isa.0"));
/* system control ports */
- isa_dev = isa_new("prep-systemio");
+ isa_dev = isa_new_orphan("prep-systemio");
dev = DEVICE(isa_dev);
qdev_prop_set_uint32(dev, "ibm-planar-id", 0xfc);
qdev_prop_set_uint32(dev, "equipment", 0xc0);
isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
/* Memory controller */
- isa_dev = isa_new("rs6000-mc");
+ isa_dev = isa_new_orphan("rs6000-mc");
dev = DEVICE(isa_dev);
qdev_prop_set_uint32(dev, "ram-size", machine->ram_size);
isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
/* RTC */
- isa_dev = isa_new(TYPE_MC146818_RTC);
+ isa_dev = isa_new_orphan(TYPE_MC146818_RTC);
dev = DEVICE(isa_dev);
qdev_prop_set_int32(dev, "base_year", 1900);
isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
@@ -334,9 +334,9 @@ static void ibm_40p_init(MachineState *machine)
/* add some more devices */
if (defaults_enabled()) {
- m48t59 = NVRAM(isa_create_simple(isa_bus, "isa-m48t59"));
+ m48t59 = NVRAM(isa_create_simple_orphan(isa_bus, "isa-m48t59"));
- isa_dev = isa_new("cs4231a");
+ isa_dev = isa_new_orphan("cs4231a");
dev = DEVICE(isa_dev);
qdev_prop_set_uint32(dev, "iobase", 0x830);
qdev_prop_set_uint32(dev, "irq", 10);
@@ -345,7 +345,7 @@ static void ibm_40p_init(MachineState *machine)
}
isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
- isa_dev = isa_new("pc87312");
+ isa_dev = isa_new_orphan("pc87312");
dev = DEVICE(isa_dev);
qdev_prop_set_uint32(dev, "config", 12);
isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
index ba396435d1..b9e5ec6ff6 100644
--- a/hw/rtc/mc146818rtc.c
+++ b/hw/rtc/mc146818rtc.c
@@ -930,7 +930,7 @@ MC146818RtcState *mc146818_rtc_init(ISABus *bus, int base_year,
ISADevice *isadev;
MC146818RtcState *s;
- isadev = isa_new(TYPE_MC146818_RTC);
+ isadev = isa_new_orphan(TYPE_MC146818_RTC);
dev = DEVICE(isadev);
s = MC146818_RTC(isadev);
qdev_prop_set_int32(dev, "base_year", base_year);
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 5de873126c..b60588cf7d 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -329,13 +329,13 @@ static void ebus_realize(PCIDevice *pci_dev, Error **errp)
parallel_hds_isa_init(s->isa_bus, MAX_PARALLEL_PORTS);
/* Keyboard */
- isa_create_simple(s->isa_bus, TYPE_I8042);
+ isa_create_simple_orphan(s->isa_bus, TYPE_I8042);
/* Floppy */
for (i = 0; i < MAX_FD; i++) {
fd[i] = drive_get(IF_FLOPPY, 0, i);
}
- isa_dev = isa_new(TYPE_ISA_FDC);
+ isa_dev = isa_new_orphan(TYPE_ISA_FDC);
dev = DEVICE(isa_dev);
qdev_prop_set_uint32(dev, "dma", -1);
isa_realize_and_unref(isa_dev, s->isa_bus, &error_fatal);
diff --git a/include/hw/i386/vmport.h b/include/hw/i386/vmport.h
index 8f5e27c6f5..22dd3645d2 100644
--- a/include/hw/i386/vmport.h
+++ b/include/hw/i386/vmport.h
@@ -20,7 +20,7 @@ typedef enum {
static inline void vmport_init(ISABus *bus)
{
- isa_create_simple(bus, TYPE_VMPORT);
+ isa_create_simple_orphan(bus, TYPE_VMPORT);
}
void vmport_register(VMPortCommand command, VMPortReadFunc *func, void *opaque);
diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h
index 94bff33fcc..af8e07c253 100644
--- a/include/hw/isa/isa.h
+++ b/include/hw/isa/isa.h
@@ -80,10 +80,14 @@ IsaDma *isa_bus_get_dma(ISABus *bus, int nchan);
* Return IRQ @irqnum from the PIC associated on ISA @bus.
*/
qemu_irq isa_bus_get_irq(ISABus *bus, unsigned irqnum);
-ISADevice *isa_new(const char *name);
-ISADevice *isa_try_new(const char *name);
+ISADevice *isa_new(Object *parent, const char *id, const char *type);
+ISADevice *isa_try_new(Object *parent, const char *id, const char *type);
+ISADevice *isa_create_simple(Object *parent, const char *id,
+ ISABus *bus, const char *type);
+ISADevice *isa_new_orphan(const char *name);
+ISADevice *isa_try_new_orphan(const char *name);
bool isa_realize_and_unref(ISADevice *dev, ISABus *bus, Error **errp);
-ISADevice *isa_create_simple(ISABus *bus, const char *name);
+ISADevice *isa_create_simple_orphan(ISABus *bus, const char *name);
ISADevice *isa_vga_init(ISABus *bus);
diff --git a/include/hw/net/ne2000-isa.h b/include/hw/net/ne2000-isa.h
index 1e14d1afc0..ef8b3334d7 100644
--- a/include/hw/net/ne2000-isa.h
+++ b/include/hw/net/ne2000-isa.h
@@ -22,7 +22,7 @@ static inline ISADevice *isa_ne2000_init(ISABus *bus, int base, int irq,
{
ISADevice *d;
- d = isa_try_new(TYPE_ISA_NE2000);
+ d = isa_try_new_orphan(TYPE_ISA_NE2000);
if (d) {
DeviceState *dev = DEVICE(d);
diff --git a/include/hw/timer/i8254.h b/include/hw/timer/i8254.h
index 65775b789d..38f896063e 100644
--- a/include/hw/timer/i8254.h
+++ b/include/hw/timer/i8254.h
@@ -51,7 +51,7 @@ static inline ISADevice *i8254_pit_init(ISABus *bus, int base, int isa_irq,
DeviceState *dev;
ISADevice *d;
- d = isa_new(TYPE_I8254);
+ d = isa_new_orphan(TYPE_I8254);
dev = DEVICE(d);
qdev_prop_set_uint32(dev, "iobase", base);
isa_realize_and_unref(d, bus, &error_fatal);
@@ -67,7 +67,7 @@ static inline ISADevice *kvm_pit_init(ISABus *bus, int base)
DeviceState *dev;
ISADevice *d;
- d = isa_new(TYPE_KVM_I8254);
+ d = isa_new_orphan(TYPE_KVM_I8254);
dev = DEVICE(d);
qdev_prop_set_uint32(dev, "iobase", base);
isa_realize_and_unref(d, bus, &error_fatal);
diff --git a/scripts/coccinelle/qom-parent/isa-new-orphan.cocci b/scripts/coccinelle/qom-parent/isa-new-orphan.cocci
new file mode 100644
index 0000000000..75393543c8
--- /dev/null
+++ b/scripts/coccinelle/qom-parent/isa-new-orphan.cocci
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+//
+// Rename isa_new()/isa_try_new()/isa_create_simple() to *_orphan()
+// so that the short names can be reintroduced with a mandatory
+// (parent, id, ...) signature.
+//
+// spatch --sp-file scripts/coccinelle/qom-parent/isa-new-orphan.cocci \
+// --in-place --include-headers --dir .
+
+@@
+@@
+- isa_new
++ isa_new_orphan
+
+@@
+@@
+- isa_try_new
++ isa_try_new_orphan
+
+@@
+@@
+- isa_create_simple
++ isa_create_simple_orphan
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 007/134] i2c: Make i2c_slave_new()/i2c_slave_create_simple() take a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (5 preceding siblings ...)
2026-07-11 22:34 ` [RFC PATCH 006/134] isa: Make isa_new()/isa_try_new()/isa_create_simple() " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 008/134] ssi, usb: Make bus-layer creators " Alexander Graf
` (127 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Same rename-and-reintroduce treatment as the qdev, sysbus, PCI and
ISA layers: mechanically rename the two I2C-slave creation helpers
to *_orphan() and reintroduce the short names with a leading
(parent, id, ...) pair.
The parented i2c_slave_create_simple() calls qdev_realize() (not
i2c_slave_realize_and_unref()) since the child<> property already
holds the sole reference.
The mechanical rename part is generated by
spatch --sp-file \
scripts/coccinelle/qom-parent/i2c-slave-new-orphan.cocci \
--in-place --include-headers --dir .
or equivalently
git ls-files '*.[ch]' '*.[ch].inc' '*.rst' '*.py' | \
grep -v '^subprojects/' | \
xargs sed -i \
's/\bi2c_slave_create_simple\b/&_orphan/g;
s/\bi2c_slave_new\b/&_orphan/g'
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/aspeed.c | 4 +-
hw/arm/aspeed_ast1040_evb.c | 2 +-
hw/arm/aspeed_ast10x0_evb.c | 2 +-
hw/arm/aspeed_ast2400_palmetto.c | 4 +-
hw/arm/aspeed_ast2400_quanta-q71l.c | 12 ++--
hw/arm/aspeed_ast2400_supermicrox11.c | 4 +-
hw/arm/aspeed_ast2500_evb.c | 2 +-
hw/arm/aspeed_ast2500_g220a.c | 6 +-
hw/arm/aspeed_ast2500_romulus.c | 2 +-
hw/arm/aspeed_ast2500_supermicro-x11spi.c | 4 +-
hw/arm/aspeed_ast2500_tiogapass.c | 6 +-
hw/arm/aspeed_ast2500_witherspoon.c | 16 ++---
hw/arm/aspeed_ast2500_yosemitev2.c | 6 +-
hw/arm/aspeed_ast2600_anacapa.c | 26 ++++-----
hw/arm/aspeed_ast2600_bletchley.c | 20 +++----
hw/arm/aspeed_ast2600_catalina.c | 58 +++++++++----------
hw/arm/aspeed_ast2600_evb.c | 2 +-
hw/arm/aspeed_ast2600_fby35.c | 10 ++--
hw/arm/aspeed_ast2600_fuji.c | 40 ++++++-------
hw/arm/aspeed_ast2600_gb200nvl.c | 12 ++--
hw/arm/aspeed_ast2600_rainier.c | 46 +++++++--------
hw/arm/aspeed_ast27x0-fc.c | 2 +-
hw/arm/aspeed_ast27x0_evb.c | 2 +-
hw/arm/bananapi_m2u.c | 2 +-
hw/arm/cubieboard.c | 2 +-
hw/arm/musicpal.c | 2 +-
hw/arm/npcm7xx_boards.c | 42 +++++++-------
hw/arm/npcm8xx_boards.c | 2 +-
hw/arm/realview.c | 2 +-
hw/arm/stellaris.c | 2 +-
hw/arm/versatilepb.c | 2 +-
hw/arm/vexpress.c | 2 +-
hw/display/sii9022.c | 2 +-
hw/i2c/aspeed_i2c.c | 2 +-
hw/i2c/core.c | 26 ++++++++-
hw/i3c/core.c | 2 +-
hw/nvram/eeprom_at24c.c | 2 +-
hw/ppc/e500.c | 2 +-
hw/ppc/pnv.c | 4 +-
hw/ppc/sam460ex.c | 2 +-
hw/riscv/tt_atlantis.c | 4 +-
include/hw/arm/aspeed.h | 4 +-
include/hw/i2c/i2c.h | 38 ++++++++++--
.../qom-parent/i2c-slave-new-orphan.cocci | 18 ++++++
44 files changed, 260 insertions(+), 192 deletions(-)
create mode 100644 scripts/coccinelle/qom-parent/i2c-slave-new-orphan.cocci
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 531e3ce276..4a4c1f1556 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -253,13 +253,13 @@ static void aspeed_machine_init(MachineState *machine)
void aspeed_create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
{
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, bus_id),
TYPE_PCA9552, addr);
}
I2CSlave *aspeed_create_pca9554(AspeedSoCState *soc, int bus_id, int addr)
{
- return i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, bus_id),
+ return i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, bus_id),
TYPE_PCA9554, addr);
}
diff --git a/hw/arm/aspeed_ast1040_evb.c b/hw/arm/aspeed_ast1040_evb.c
index 2b93d4dfbc..d0326d39f9 100644
--- a/hw/arm/aspeed_ast1040_evb.c
+++ b/hw/arm/aspeed_ast1040_evb.c
@@ -55,7 +55,7 @@ static void ast1040_evb_i2c_init(AspeedMachineState *bmc)
uint8_t *eeprom_buf = g_malloc0(256);
smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
}
static void aspeed_machine_ast1040_evb_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast10x0_evb.c b/hw/arm/aspeed_ast10x0_evb.c
index c19563d1f0..52ead37bc7 100644
--- a/hw/arm/aspeed_ast10x0_evb.c
+++ b/hw/arm/aspeed_ast10x0_evb.c
@@ -73,7 +73,7 @@ static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
/* U11 LM75 connects to SDA/SCL Group 2 by default */
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
}
static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast2400_palmetto.c b/hw/arm/aspeed_ast2400_palmetto.c
index 776aa43a45..d89d042ce2 100644
--- a/hw/arm/aspeed_ast2400_palmetto.c
+++ b/hw/arm/aspeed_ast2400_palmetto.c
@@ -37,13 +37,13 @@ static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
* The palmetto platform expects a ds3231 RTC but a ds1338 is
* enough to provide basic RTC features. Alarms will be missing
*/
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
eeprom_buf);
/* add a TMP423 temperature sensor */
- dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
+ dev = DEVICE(i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 2),
"tmp423", 0x4c));
object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
diff --git a/hw/arm/aspeed_ast2400_quanta-q71l.c b/hw/arm/aspeed_ast2400_quanta-q71l.c
index 42ad2a2303..802ae49604 100644
--- a/hw/arm/aspeed_ast2400_quanta-q71l.c
+++ b/hw/arm/aspeed_ast2400_quanta-q71l.c
@@ -33,21 +33,21 @@ static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
* The quanta-q71l platform expects tmp75s which are compatible with
* tmp105s.
*/
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
/* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
/* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
/* TODO: Add Memory Riser i2c mux and eeproms. */
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
/* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
/* i2c-7 */
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
/* - i2c@0: pmbus@59 */
/* - i2c@1: pmbus@58 */
/* - i2c@2: pmbus@58 */
diff --git a/hw/arm/aspeed_ast2400_supermicrox11.c b/hw/arm/aspeed_ast2400_supermicrox11.c
index 88cdb01fc7..9c90998754 100644
--- a/hw/arm/aspeed_ast2400_supermicrox11.c
+++ b/hw/arm/aspeed_ast2400_supermicrox11.c
@@ -37,13 +37,13 @@ static void supermicrox11_bmc_i2c_init(AspeedMachineState *bmc)
* The palmetto platform expects a ds3231 RTC but a ds1338 is
* enough to provide basic RTC features. Alarms will be missing
*/
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
eeprom_buf);
/* add a TMP423 temperature sensor */
- dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
+ dev = DEVICE(i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 2),
"tmp423", 0x4c));
object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
diff --git a/hw/arm/aspeed_ast2500_evb.c b/hw/arm/aspeed_ast2500_evb.c
index 8b5cb67be9..e46ce4a5aa 100644
--- a/hw/arm/aspeed_ast2500_evb.c
+++ b/hw/arm/aspeed_ast2500_evb.c
@@ -34,7 +34,7 @@ static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
eeprom_buf);
/* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 7),
TYPE_TMP105, 0x4d);
}
diff --git a/hw/arm/aspeed_ast2500_g220a.c b/hw/arm/aspeed_ast2500_g220a.c
index 3f979a78e5..577ee0aff4 100644
--- a/hw/arm/aspeed_ast2500_g220a.c
+++ b/hw/arm/aspeed_ast2500_g220a.c
@@ -32,19 +32,19 @@ static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
AspeedSoCState *soc = bmc->soc;
DeviceState *dev;
- dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
+ dev = DEVICE(i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 3),
"emc1413", 0x4c));
object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
- dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 12),
+ dev = DEVICE(i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 12),
"emc1413", 0x4c));
object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
- dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 13),
+ dev = DEVICE(i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 13),
"emc1413", 0x4c));
object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
diff --git a/hw/arm/aspeed_ast2500_romulus.c b/hw/arm/aspeed_ast2500_romulus.c
index 91b660e74b..1bbd2802f1 100644
--- a/hw/arm/aspeed_ast2500_romulus.c
+++ b/hw/arm/aspeed_ast2500_romulus.c
@@ -30,7 +30,7 @@ static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
* good enough
*/
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
}
static void aspeed_machine_romulus_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast2500_supermicro-x11spi.c b/hw/arm/aspeed_ast2500_supermicro-x11spi.c
index a2450aa962..9e95d26901 100644
--- a/hw/arm/aspeed_ast2500_supermicro-x11spi.c
+++ b/hw/arm/aspeed_ast2500_supermicro-x11spi.c
@@ -33,13 +33,13 @@ static void supermicro_x11spi_bmc_i2c_init(AspeedMachineState *bmc)
* The palmetto platform expects a ds3231 RTC but a ds1338 is
* enough to provide basic RTC features. Alarms will be missing
*/
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
eeprom_buf);
/* add a TMP423 temperature sensor */
- dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2),
+ dev = DEVICE(i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 2),
"tmp423", 0x4c));
object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
diff --git a/hw/arm/aspeed_ast2500_tiogapass.c b/hw/arm/aspeed_ast2500_tiogapass.c
index 186dbc1da3..a6b3c0d051 100644
--- a/hw/arm/aspeed_ast2500_tiogapass.c
+++ b/hw/arm/aspeed_ast2500_tiogapass.c
@@ -55,9 +55,9 @@ static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
/* TMP421 */
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
}
static void aspeed_machine_tiogapass_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast2500_witherspoon.c b/hw/arm/aspeed_ast2500_witherspoon.c
index 28d437fec0..cb57cb421a 100644
--- a/hw/arm/aspeed_ast2500_witherspoon.c
+++ b/hw/arm/aspeed_ast2500_witherspoon.c
@@ -44,7 +44,7 @@ static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
LEDState *led;
/* Bus 3: TODO bmp280@77 */
- dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
+ dev = DEVICE(i2c_slave_new_orphan(TYPE_PCA9552, 0x60));
qdev_prop_set_string(dev, "description", "pca1");
i2c_slave_realize_and_unref(I2C_SLAVE(dev),
aspeed_i2c_get_bus(&soc->i2c, 3),
@@ -58,24 +58,24 @@ static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
qdev_get_gpio_in(DEVICE(led), 0));
}
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
/* The Witherspoon expects a TMP275 but a TMP105 is compatible */
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
0x4a);
/*
* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
* good enough
*/
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
eeprom_buf);
- dev = DEVICE(i2c_slave_new(TYPE_PCA9552, 0x60));
+ dev = DEVICE(i2c_slave_new_orphan(TYPE_PCA9552, 0x60));
qdev_prop_set_string(dev, "description", "pca0");
i2c_slave_realize_and_unref(I2C_SLAVE(dev),
aspeed_i2c_get_bus(&soc->i2c, 11),
diff --git a/hw/arm/aspeed_ast2500_yosemitev2.c b/hw/arm/aspeed_ast2500_yosemitev2.c
index eaa75bcccb..905758c345 100644
--- a/hw/arm/aspeed_ast2500_yosemitev2.c
+++ b/hw/arm/aspeed_ast2500_yosemitev2.c
@@ -55,9 +55,9 @@ static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
/* TMP421 */
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
}
diff --git a/hw/arm/aspeed_ast2600_anacapa.c b/hw/arm/aspeed_ast2600_anacapa.c
index a1c8111a93..98395f196b 100644
--- a/hw/arm/aspeed_ast2600_anacapa.c
+++ b/hw/arm/aspeed_ast2600_anacapa.c
@@ -237,17 +237,17 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* eeprom@50 */
at24c_eeprom_init(i2c[0], 0x50, 256 * KiB);
/* i2c-mux@70 */
- i2c_slave_create_simple(i2c[0], TYPE_PCA9546, 0x70);
+ i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x70);
/* &i2c1 */
/* eeprom@50 */
at24c_eeprom_init(i2c[1], 0x50, 256 * KiB);
/* i2c-mux@70 (PCA9546) — 4 channels, empty */
- i2c_slave_create_simple(i2c[1], TYPE_PCA9546, 0x70);
+ i2c_slave_create_simple_orphan(i2c[1], TYPE_PCA9546, 0x70);
/* &i2c4 */
/* i2c-mux@70 (PCA9548) */
- i2c_slave_create_simple(i2c[4], TYPE_PCA9548, 0x70);
+ i2c_slave_create_simple_orphan(i2c[4], TYPE_PCA9548, 0x70);
/* &i2c6 */
/* eeprom@50 */
@@ -256,15 +256,15 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c8 */
/* i2c-mux@72 (PCA9546) */
- i2c_mux = i2c_slave_create_simple(i2c[8], TYPE_PCA9546, 0x72);
+ i2c_mux = i2c_slave_create_simple_orphan(i2c[8], TYPE_PCA9546, 0x72);
/* i2c8mux ch0 */
/* adc128d818@1f — no model */
/* pca9555@22 */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0),
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 0),
TYPE_PCA9552, 0x22);
/* pca9555@24 */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 0),
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 0),
TYPE_PCA9552, 0x24);
/* eeprom@50 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 16 * KiB,
@@ -272,10 +272,10 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* i2c8mux ch1 */
/* pca9555@22 */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 1),
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 1),
TYPE_PCA9552, 0x22);
/* pca9555@24 */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 1),
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 1),
TYPE_PCA9552, 0x24);
/* eeprom@50 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 16 * KiB,
@@ -291,11 +291,11 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c10 */
/* i2c-mux@71 (PCA9548) */
- i2c_mux = i2c_slave_create_simple(i2c[10], TYPE_PCA9548, 0x71);
+ i2c_mux = i2c_slave_create_simple_orphan(i2c[10], TYPE_PCA9548, 0x71);
/* i2c10mux ch5 */
/* pca9555@22*/
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 5),
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 5),
TYPE_PCA9552, 0x22);
/* eeprom@52 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 5), 0x52, 32 * KiB,
@@ -303,13 +303,13 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c11 */
/* i2c-mux@71 (PCA9548) */
- i2c_mux = i2c_slave_create_simple(i2c[11], TYPE_PCA9548, 0x71);
+ i2c_mux = i2c_slave_create_simple_orphan(i2c[11], TYPE_PCA9548, 0x71);
/* i2c11mux ch0-ch4 — empty */
/* i2c11mux ch5 */
/* pca9555@22 */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 5),
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 5),
TYPE_PCA9552, 0x22);
/* eeprom@52 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 5), 0x52, 32 * KiB,
@@ -317,7 +317,7 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c13 */
/* i2c-mux@70 (PCA9548) */
- i2c_mux = i2c_slave_create_simple(i2c[13], TYPE_PCA9548, 0x70);
+ i2c_mux = i2c_slave_create_simple_orphan(i2c[13], TYPE_PCA9548, 0x70);
/* i2c13mux ch3 */
/* adc128d818@1f - no model */
diff --git a/hw/arm/aspeed_ast2600_bletchley.c b/hw/arm/aspeed_ast2600_bletchley.c
index b7e84db143..4930bddb39 100644
--- a/hw/arm/aspeed_ast2600_bletchley.c
+++ b/hw/arm/aspeed_ast2600_bletchley.c
@@ -35,35 +35,35 @@ static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
for (int i = 0; i < 6; i++) {
/* Missing model: ti,ina230 @ 0x45 */
/* Missing model: mps,mp5023 @ 0x40 */
- i2c_slave_create_simple(i2c[i], TYPE_TMP421, 0x4f);
+ i2c_slave_create_simple_orphan(i2c[i], TYPE_TMP421, 0x4f);
/* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
- i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x76);
- i2c_slave_create_simple(i2c[i], TYPE_PCA9552, 0x67);
+ i2c_slave_create_simple_orphan(i2c[i], TYPE_PCA9552, 0x76);
+ i2c_slave_create_simple_orphan(i2c[i], TYPE_PCA9552, 0x67);
/* Missing model: fsc,fusb302 @ 0x22 */
}
/* Bus 6 */
at24c_eeprom_init(i2c[6], 0x56, 65536);
/* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
- i2c_slave_create_simple(i2c[6], "ds1338", 0x51);
+ i2c_slave_create_simple_orphan(i2c[6], "ds1338", 0x51);
/* Bus 7 */
at24c_eeprom_init(i2c[7], 0x54, 65536);
/* Bus 9 */
- i2c_slave_create_simple(i2c[9], TYPE_TMP421, 0x4f);
+ i2c_slave_create_simple_orphan(i2c[9], TYPE_TMP421, 0x4f);
/* Bus 10 */
- i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x4f);
+ i2c_slave_create_simple_orphan(i2c[10], TYPE_TMP421, 0x4f);
/* Missing model: ti,hdc1080 @ 0x40 */
- i2c_slave_create_simple(i2c[10], TYPE_PCA9552, 0x67);
+ i2c_slave_create_simple_orphan(i2c[10], TYPE_PCA9552, 0x67);
/* Bus 12 */
/* Missing model: adi,adm1278 @ 0x11 */
- i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4c);
- i2c_slave_create_simple(i2c[12], TYPE_TMP421, 0x4d);
- i2c_slave_create_simple(i2c[12], TYPE_PCA9552, 0x67);
+ i2c_slave_create_simple_orphan(i2c[12], TYPE_TMP421, 0x4c);
+ i2c_slave_create_simple_orphan(i2c[12], TYPE_TMP421, 0x4d);
+ i2c_slave_create_simple_orphan(i2c[12], TYPE_PCA9552, 0x67);
}
static void aspeed_machine_bletchley_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast2600_catalina.c b/hw/arm/aspeed_ast2600_catalina.c
index 65495a524e..c2c949ace3 100644
--- a/hw/arm/aspeed_ast2600_catalina.c
+++ b/hw/arm/aspeed_ast2600_catalina.c
@@ -472,43 +472,43 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c0 */
/* i2c-mux@71 (PCA9546) on i2c0 */
- i2c_slave_create_simple(i2c[0], TYPE_PCA9546, 0x71);
+ i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x71);
/* i2c-mux@72 (PCA9546) on i2c0 */
- i2c_mux = i2c_slave_create_simple(i2c[0], TYPE_PCA9546, 0x72);
+ i2c_mux = i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x72);
/* i2c0mux1ch1 */
/* io_expander7 - pca9535@20 */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 1),
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 1),
TYPE_PCA9535, 0x20);
/* eeprom@50 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 8 * KiB,
gb200io_eeprom, gb200io_eeprom_len);
/* i2c-mux@73 (PCA9546) on i2c0 */
- i2c_slave_create_simple(i2c[0], TYPE_PCA9546, 0x73);
+ i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x73);
/* i2c-mux@75 (PCA9546) on i2c0 */
- i2c_slave_create_simple(i2c[0], TYPE_PCA9546, 0x75);
+ i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x75);
/* i2c-mux@76 (PCA9546) on i2c0 */
- i2c_mux = i2c_slave_create_simple(i2c[0], TYPE_PCA9546, 0x76);
+ i2c_mux = i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x76);
/* i2c0mux4ch1 */
/* io_expander8 - pca9535@21 */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 1),
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 1),
TYPE_PCA9535, 0x21);
/* eeprom@50 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 8 * KiB,
gb200io_eeprom, gb200io_eeprom_len);
/* i2c-mux@77 (PCA9546) on i2c0 */
- i2c_slave_create_simple(i2c[0], TYPE_PCA9546, 0x77);
+ i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x77);
/* &i2c1 */
/* i2c-mux@70 (PCA9548) on i2c1 */
- i2c_mux = i2c_slave_create_simple(i2c[1], TYPE_PCA9548, 0x70);
+ i2c_mux = i2c_slave_create_simple_orphan(i2c[1], TYPE_PCA9548, 0x70);
/* i2c1mux0ch0 */
/* ina238@41 - no model */
/* ina238@42 - no model */
@@ -525,14 +525,14 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 5), 0x54, 8 * KiB,
pdb_eeprom, pdb_eeprom_len);
/* tpm75@4f */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 5), TYPE_TMP75, 0x4f);
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 5), TYPE_TMP75, 0x4f);
/* i2c1mux0ch6 */
/* io_expander5 - pca9554@27 */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 6),
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 6),
TYPE_PCA9554, 0x27);
/* io_expander6 - pca9555@25 */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 6),
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 6),
TYPE_PCA9552, 0x25);
/* eeprom@51 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 6), 0x51, 8 * KiB,
@@ -543,15 +543,15 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 7), 0x53, 8 * KiB,
fio_eeprom, fio_eeprom_len);
/* temperature-sensor@4b - tmp75 */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 7), TYPE_TMP75, 0x4b);
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 7), TYPE_TMP75, 0x4b);
/* &i2c2 */
/* io_expander0 - pca9555@20 */
- i2c_slave_create_simple(i2c[2], TYPE_PCA9552, 0x20);
+ i2c_slave_create_simple_orphan(i2c[2], TYPE_PCA9552, 0x20);
/* io_expander0 - pca9555@21 */
- i2c_slave_create_simple(i2c[2], TYPE_PCA9552, 0x21);
+ i2c_slave_create_simple_orphan(i2c[2], TYPE_PCA9552, 0x21);
/* io_expander0 - pca9555@27 */
- i2c_slave_create_simple(i2c[2], TYPE_PCA9552, 0x27);
+ i2c_slave_create_simple_orphan(i2c[2], TYPE_PCA9552, 0x27);
/* eeprom@50 */
at24c_eeprom_init(i2c[2], 0x50, 8 * KiB);
/* eeprom@51 */
@@ -559,7 +559,7 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c5 */
/* i2c-mux@70 (PCA9548) on i2c5 */
- i2c_mux = i2c_slave_create_simple(i2c[5], TYPE_PCA9548, 0x70);
+ i2c_mux = i2c_slave_create_simple_orphan(i2c[5], TYPE_PCA9548, 0x70);
/* i2c5mux0ch6 */
/* eeprom@52 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 6), 0x52, 8 * KiB,
@@ -572,15 +572,15 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c6 */
/* io_expander3 - pca9555@21 */
- i2c_slave_create_simple(i2c[6], TYPE_PCA9552, 0x21);
+ i2c_slave_create_simple_orphan(i2c[6], TYPE_PCA9552, 0x21);
/* rtc@6f - nct3018y */
- i2c_slave_create_simple(i2c[6], TYPE_DS1338, 0x6f);
+ i2c_slave_create_simple_orphan(i2c[6], TYPE_DS1338, 0x6f);
/* &i2c9 */
/* io_expander4 - pca9555@4f */
- i2c_slave_create_simple(i2c[9], TYPE_PCA9552, 0x4f);
+ i2c_slave_create_simple_orphan(i2c[9], TYPE_PCA9552, 0x4f);
/* temperature-sensor@4b - tpm75 */
- i2c_slave_create_simple(i2c[9], TYPE_TMP75, 0x4b);
+ i2c_slave_create_simple_orphan(i2c[9], TYPE_TMP75, 0x4b);
/* eeprom@50 */
at24c_eeprom_init_rom(i2c[9], 0x50, 8 * KiB, scm_eeprom, scm_eeprom_len);
/* eeprom@56 */
@@ -588,7 +588,7 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c10 */
/* temperature-sensor@1f - tpm421 */
- i2c_slave_create_simple(i2c[10], TYPE_TMP421, 0x1f);
+ i2c_slave_create_simple_orphan(i2c[10], TYPE_TMP421, 0x1f);
/* eeprom@50 */
at24c_eeprom_init_rom(i2c[10], 0x50, 8 * KiB, nic_eeprom, nic_eeprom_len);
@@ -615,21 +615,21 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c14 */
/* io_expander9 - pca9555@10 */
- i2c_slave_create_simple(i2c[14], TYPE_PCA9552, 0x10);
+ i2c_slave_create_simple_orphan(i2c[14], TYPE_PCA9552, 0x10);
/* io_expander10 - pca9555@11 */
- i2c_slave_create_simple(i2c[14], TYPE_PCA9552, 0x11);
+ i2c_slave_create_simple_orphan(i2c[14], TYPE_PCA9552, 0x11);
/* io_expander11 - pca9555@12 */
- i2c_slave_create_simple(i2c[14], TYPE_PCA9552, 0x12);
+ i2c_slave_create_simple_orphan(i2c[14], TYPE_PCA9552, 0x12);
/* io_expander12 - pca9555@13 */
- i2c_slave_create_simple(i2c[14], TYPE_PCA9552, 0x13);
+ i2c_slave_create_simple_orphan(i2c[14], TYPE_PCA9552, 0x13);
/* io_expander13 - pca9555@14 */
- i2c_slave_create_simple(i2c[14], TYPE_PCA9552, 0x14);
+ i2c_slave_create_simple_orphan(i2c[14], TYPE_PCA9552, 0x14);
/* io_expander14 - pca9555@15 */
- i2c_slave_create_simple(i2c[14], TYPE_PCA9552, 0x15);
+ i2c_slave_create_simple_orphan(i2c[14], TYPE_PCA9552, 0x15);
/* &i2c15 */
/* temperature-sensor@1f - tmp421 */
- i2c_slave_create_simple(i2c[15], TYPE_TMP421, 0x1f);
+ i2c_slave_create_simple_orphan(i2c[15], TYPE_TMP421, 0x1f);
/* eeprom@52 */
at24c_eeprom_init_rom(i2c[15], 0x52, 8 * KiB, nic_eeprom, nic_eeprom_len);
}
diff --git a/hw/arm/aspeed_ast2600_evb.c b/hw/arm/aspeed_ast2600_evb.c
index c43d2687c1..cf1e2b006c 100644
--- a/hw/arm/aspeed_ast2600_evb.c
+++ b/hw/arm/aspeed_ast2600_evb.c
@@ -27,7 +27,7 @@ static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
eeprom_buf);
/* LM75 is compatible with TMP105 driver */
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8),
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 8),
TYPE_TMP105, 0x4d);
}
diff --git a/hw/arm/aspeed_ast2600_fby35.c b/hw/arm/aspeed_ast2600_fby35.c
index f624427070..fcd1acdc17 100644
--- a/hw/arm/aspeed_ast2600_fby35.c
+++ b/hw/arm/aspeed_ast2600_fby35.c
@@ -102,12 +102,12 @@ static void fby35_i2c_init(AspeedMachineState *bmc)
i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
}
- i2c_slave_create_simple(i2c[2], TYPE_LM75, 0x4f);
- i2c_slave_create_simple(i2c[8], TYPE_TMP421, 0x1f);
+ i2c_slave_create_simple_orphan(i2c[2], TYPE_LM75, 0x4f);
+ i2c_slave_create_simple_orphan(i2c[8], TYPE_TMP421, 0x1f);
/* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
- i2c_slave_create_simple(i2c[11], "adm1272", 0x44);
- i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4e);
- i2c_slave_create_simple(i2c[12], TYPE_LM75, 0x4f);
+ i2c_slave_create_simple_orphan(i2c[11], "adm1272", 0x44);
+ i2c_slave_create_simple_orphan(i2c[12], TYPE_LM75, 0x4e);
+ i2c_slave_create_simple_orphan(i2c[12], TYPE_LM75, 0x4f);
at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
diff --git a/hw/arm/aspeed_ast2600_fuji.c b/hw/arm/aspeed_ast2600_fuji.c
index 37db252e27..59b2da1ccf 100644
--- a/hw/arm/aspeed_ast2600_fuji.c
+++ b/hw/arm/aspeed_ast2600_fuji.c
@@ -27,7 +27,7 @@
static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
I2CBus **channels)
{
- I2CSlave *mux = i2c_slave_create_simple(bus, "pca9548", mux_addr);
+ I2CSlave *mux = i2c_slave_create_simple_orphan(bus, "pca9548", mux_addr);
for (int i = 0; i < 8; i++) {
channels[i] = pca954x_i2c_get_bus(mux, i);
}
@@ -57,8 +57,8 @@ static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
}
- i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4c);
- i2c_slave_create_simple(i2c[17], TYPE_LM75, 0x4d);
+ i2c_slave_create_simple_orphan(i2c[17], TYPE_LM75, 0x4c);
+ i2c_slave_create_simple_orphan(i2c[17], TYPE_LM75, 0x4d);
/*
* EEPROM 24c64 size is 64Kbits or 8 Kbytes
@@ -68,33 +68,33 @@ static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init(i2c[20], 0x50, 256);
at24c_eeprom_init(i2c[22], 0x52, 256);
- i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x48);
- i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x49);
- i2c_slave_create_simple(i2c[3], TYPE_LM75, 0x4a);
- i2c_slave_create_simple(i2c[3], TYPE_TMP422, 0x4c);
+ i2c_slave_create_simple_orphan(i2c[3], TYPE_LM75, 0x48);
+ i2c_slave_create_simple_orphan(i2c[3], TYPE_LM75, 0x49);
+ i2c_slave_create_simple_orphan(i2c[3], TYPE_LM75, 0x4a);
+ i2c_slave_create_simple_orphan(i2c[3], TYPE_TMP422, 0x4c);
at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
- i2c_slave_create_simple(i2c[8], TYPE_LM75, 0x4a);
+ i2c_slave_create_simple_orphan(i2c[8], TYPE_LM75, 0x4a);
- i2c_slave_create_simple(i2c[50], TYPE_LM75, 0x4c);
+ i2c_slave_create_simple_orphan(i2c[50], TYPE_LM75, 0x4c);
at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
- i2c_slave_create_simple(i2c[51], TYPE_TMP75, 0x48);
- i2c_slave_create_simple(i2c[52], TYPE_TMP75, 0x49);
+ i2c_slave_create_simple_orphan(i2c[51], TYPE_TMP75, 0x48);
+ i2c_slave_create_simple_orphan(i2c[52], TYPE_TMP75, 0x49);
- i2c_slave_create_simple(i2c[59], TYPE_TMP75, 0x48);
- i2c_slave_create_simple(i2c[60], TYPE_TMP75, 0x49);
+ i2c_slave_create_simple_orphan(i2c[59], TYPE_TMP75, 0x48);
+ i2c_slave_create_simple_orphan(i2c[60], TYPE_TMP75, 0x49);
at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
- i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x49);
- i2c_slave_create_simple(i2c[66], TYPE_TMP75, 0x48);
+ i2c_slave_create_simple_orphan(i2c[66], TYPE_TMP75, 0x49);
+ i2c_slave_create_simple_orphan(i2c[66], TYPE_TMP75, 0x48);
at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
- i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x49);
- i2c_slave_create_simple(i2c[74], TYPE_TMP75, 0x48);
+ i2c_slave_create_simple_orphan(i2c[74], TYPE_TMP75, 0x49);
+ i2c_slave_create_simple_orphan(i2c[74], TYPE_TMP75, 0x48);
at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
@@ -103,9 +103,9 @@ static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
for (int i = 0; i < 8; i++) {
at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
- i2c_slave_create_simple(i2c[82 + i * 8], TYPE_TMP75, 0x48);
- i2c_slave_create_simple(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
- i2c_slave_create_simple(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
+ i2c_slave_create_simple_orphan(i2c[82 + i * 8], TYPE_TMP75, 0x48);
+ i2c_slave_create_simple_orphan(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
+ i2c_slave_create_simple_orphan(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
}
}
diff --git a/hw/arm/aspeed_ast2600_gb200nvl.c b/hw/arm/aspeed_ast2600_gb200nvl.c
index ad9a10110b..2c1c513674 100644
--- a/hw/arm/aspeed_ast2600_gb200nvl.c
+++ b/hw/arm/aspeed_ast2600_gb200nvl.c
@@ -54,12 +54,12 @@ static void gb200nvl_bmc_i2c_init(AspeedMachineState *bmc)
aspeed_create_pca9554(soc, 4, 0x21);
/* Mux I2c Expanders */
- i2c_slave_create_simple(i2c[5], "pca9546", 0x71);
- i2c_slave_create_simple(i2c[5], "pca9546", 0x72);
- i2c_slave_create_simple(i2c[5], "pca9546", 0x73);
- i2c_slave_create_simple(i2c[5], "pca9546", 0x75);
- i2c_slave_create_simple(i2c[5], "pca9546", 0x76);
- i2c_slave_create_simple(i2c[5], "pca9546", 0x77);
+ i2c_slave_create_simple_orphan(i2c[5], "pca9546", 0x71);
+ i2c_slave_create_simple_orphan(i2c[5], "pca9546", 0x72);
+ i2c_slave_create_simple_orphan(i2c[5], "pca9546", 0x73);
+ i2c_slave_create_simple_orphan(i2c[5], "pca9546", 0x75);
+ i2c_slave_create_simple_orphan(i2c[5], "pca9546", 0x76);
+ i2c_slave_create_simple_orphan(i2c[5], "pca9546", 0x77);
/* Bus 10 */
dev = DEVICE(aspeed_create_pca9554(soc, 9, 0x20));
diff --git a/hw/arm/aspeed_ast2600_rainier.c b/hw/arm/aspeed_ast2600_rainier.c
index 8f0a412ddc..0495c2880c 100644
--- a/hw/arm/aspeed_ast2600_rainier.c
+++ b/hw/arm/aspeed_ast2600_rainier.c
@@ -73,37 +73,37 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
aspeed_create_pca9552(soc, 3, 0x61);
/* The rainier expects a TMP275 but a TMP105 is compatible */
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
0x48);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
0x49);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
0x4a);
- i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 4),
+ i2c_mux = i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 4),
"pca9546", 0x70);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
aspeed_create_pca9552(soc, 4, 0x60);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
0x48);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
0x49);
aspeed_create_pca9552(soc, 5, 0x60);
aspeed_create_pca9552(soc, 5, 0x61);
- i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 5),
+ i2c_mux = i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 5),
"pca9546", 0x70);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
0x48);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
0x4a);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
0x4b);
- i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 6),
+ i2c_mux = i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 6),
"pca9546", 0x70);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
@@ -116,17 +116,17 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
aspeed_create_pca9552(soc, 7, 0x33);
aspeed_create_pca9552(soc, 7, 0x60);
aspeed_create_pca9552(soc, 7, 0x61);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
/* Bus 7: TODO si7021-a20@20 */
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
0x48);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
0x48);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
0x4a);
at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
@@ -138,19 +138,19 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
/* Bus 8: ucd90320@b */
/* Bus 8: ucd90320@c */
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
0x48);
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
0x49);
- i2c_mux = i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11),
+ i2c_mux = i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11),
"pca9546", 0x70);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
diff --git a/hw/arm/aspeed_ast27x0-fc.c b/hw/arm/aspeed_ast27x0-fc.c
index 7d9fade68d..f21c842315 100644
--- a/hw/arm/aspeed_ast27x0-fc.c
+++ b/hw/arm/aspeed_ast27x0-fc.c
@@ -109,7 +109,7 @@ static bool ast2700fc_ca35_init(MachineState *machine, Error **errp)
/*
* AST2700 EVB has a LM75 temperature sensor on I2C bus 0 at address 0x4d.
*/
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0), "tmp105", 0x4d);
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0), "tmp105", 0x4d);
aspeed_board_init_flashes(&soc->fmc, AST2700FC_FMC_MODEL, 2, 0);
aspeed_board_init_flashes(&soc->spi[0], AST2700FC_SPI_MODEL, 1, 2);
diff --git a/hw/arm/aspeed_ast27x0_evb.c b/hw/arm/aspeed_ast27x0_evb.c
index 0ff1bebeb0..a59714372d 100644
--- a/hw/arm/aspeed_ast27x0_evb.c
+++ b/hw/arm/aspeed_ast27x0_evb.c
@@ -24,7 +24,7 @@ static void ast2700_evb_i2c_init(AspeedMachineState *bmc)
AspeedSoCState *soc = bmc->soc;
/* LM75 is compatible with TMP105 driver */
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 0),
+ i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0),
TYPE_TMP105, 0x4d);
}
diff --git a/hw/arm/bananapi_m2u.c b/hw/arm/bananapi_m2u.c
index 748db26d41..809c8bbc43 100644
--- a/hw/arm/bananapi_m2u.c
+++ b/hw/arm/bananapi_m2u.c
@@ -114,7 +114,7 @@ static void bpim2u_init(MachineState *machine)
/* Connect AXP221 */
i2c = I2C_BUS(qdev_get_child_bus(DEVICE(&r40->i2c0), "i2c"));
- i2c_slave_create_simple(i2c, "axp221_pmu", 0x34);
+ i2c_slave_create_simple_orphan(i2c, "axp221_pmu", 0x34);
/* SDRAM */
memory_region_add_subregion(get_system_memory(),
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index 215741a194..7ce5179345 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -81,7 +81,7 @@ static void cubieboard_init(MachineState *machine)
/* Connect AXP 209 */
i2c = I2C_BUS(qdev_get_child_bus(DEVICE(&a10->i2c0), "i2c"));
- i2c_slave_create_simple(i2c, "axp209_pmu", 0x34);
+ i2c_slave_create_simple_orphan(i2c, "axp209_pmu", 0x34);
/* Retrieve SD bus */
di = drive_get(IF_SD, 0, 0);
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index 3bcdea7db8..baab159bfd 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1327,7 +1327,7 @@ static void musicpal_init(MachineState *machine)
qdev_connect_gpio_out(key_dev, i, qdev_get_gpio_in(dev, i + 15));
}
- wm8750_dev = i2c_slave_new(TYPE_WM8750, MP_WM_ADDR);
+ wm8750_dev = i2c_slave_new_orphan(TYPE_WM8750, MP_WM_ADDR);
if (machine->audiodev) {
qdev_prop_set_string(DEVICE(wm8750_dev), "audiodev", machine->audiodev);
}
diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
index 9e5d5f08f9..7b5cdd7191 100644
--- a/hw/arm/npcm7xx_boards.c
+++ b/hw/arm/npcm7xx_boards.c
@@ -198,13 +198,13 @@ static void npcm7xx_connect_pwm_fan(NPCM7xxState *soc, SplitIRQ *splitter,
static void npcm750_evb_i2c_init(NPCM7xxState *soc)
{
/* lm75 temperature sensor on SVB, tmp105 is compatible */
- i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 0), "tmp105", 0x48);
+ i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 0), "tmp105", 0x48);
/* lm75 temperature sensor on EB, tmp105 is compatible */
- i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 1), "tmp105", 0x48);
+ i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 1), "tmp105", 0x48);
/* tmp100 temperature sensor on EB, tmp105 is compatible */
- i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 2), "tmp105", 0x48);
+ i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 2), "tmp105", 0x48);
/* tmp100 temperature sensor on SVB, tmp105 is compatible */
- i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 6), "tmp105", 0x48);
+ i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 6), "tmp105", 0x48);
}
static void npcm750_evb_fan_init(NPCM7xxMachine *machine, NPCM7xxState *soc)
@@ -234,10 +234,10 @@ static void npcm750_evb_fan_init(NPCM7xxMachine *machine, NPCM7xxState *soc)
static void quanta_gsj_i2c_init(NPCM7xxState *soc)
{
/* GSJ machine have 4 max31725 temperature sensors, tmp105 is compatible. */
- i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 1), "tmp105", 0x5c);
- i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 2), "tmp105", 0x5c);
- i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 3), "tmp105", 0x5c);
- i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 4), "tmp105", 0x5c);
+ i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 1), "tmp105", 0x5c);
+ i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 2), "tmp105", 0x5c);
+ i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 3), "tmp105", 0x5c);
+ i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 4), "tmp105", 0x5c);
at24c_eeprom_init(npcm7xx_i2c_get_bus(soc, 9), 0x55, 8192);
at24c_eeprom_init(npcm7xx_i2c_get_bus(soc, 10), 0x55, 8192);
@@ -253,7 +253,7 @@ static void quanta_gsj_i2c_init(NPCM7xxState *soc)
* - ucd90160@6b
*/
- i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 15), "pca9548", 0x75);
+ i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 15), "pca9548", 0x75);
}
static void quanta_gsj_fan_init(NPCM7xxMachine *machine, NPCM7xxState *soc)
@@ -333,29 +333,29 @@ static void kudo_bmc_i2c_init(NPCM7xxState *soc)
{
I2CSlave *i2c_mux;
- i2c_mux = i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 1),
+ i2c_mux = i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 1),
TYPE_PCA9548, 0x75);
/* tmp105 is compatible with the lm75 */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 4), "tmp105", 0x5c);
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 5), "tmp105", 0x5c);
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 6), "tmp105", 0x5c);
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 7), "tmp105", 0x5c);
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 4), "tmp105", 0x5c);
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 5), "tmp105", 0x5c);
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 6), "tmp105", 0x5c);
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 7), "tmp105", 0x5c);
- i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 1), TYPE_PCA9548, 0x77);
+ i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 1), TYPE_PCA9548, 0x77);
- i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 4), TYPE_PCA9548, 0x77);
+ i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 4), TYPE_PCA9548, 0x77);
at24c_eeprom_init(npcm7xx_i2c_get_bus(soc, 4), 0x50, 8192); /* mbfru */
- i2c_mux = i2c_slave_create_simple(npcm7xx_i2c_get_bus(soc, 13),
+ i2c_mux = i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 13),
TYPE_PCA9548, 0x77);
/* tmp105 is compatible with the lm75 */
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 2), "tmp105", 0x48);
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 3), "tmp105", 0x49);
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 4), "tmp105", 0x48);
- i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 5), "tmp105", 0x49);
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 2), "tmp105", 0x48);
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 3), "tmp105", 0x49);
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 4), "tmp105", 0x48);
+ i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 5), "tmp105", 0x49);
at24c_eeprom_init(npcm7xx_i2c_get_bus(soc, 14), 0x55, 8192); /* bmcfru */
diff --git a/hw/arm/npcm8xx_boards.c b/hw/arm/npcm8xx_boards.c
index 10df2d614c..eb0248552f 100644
--- a/hw/arm/npcm8xx_boards.c
+++ b/hw/arm/npcm8xx_boards.c
@@ -159,7 +159,7 @@ static void npcm8xx_connect_pwm_fan(NPCM8xxState *soc, SplitIRQ *splitter,
static void npcm845_evb_i2c_init(NPCM8xxState *soc)
{
/* tmp100 temperature sensor on SVB, tmp105 is compatible */
- i2c_slave_create_simple(npcm8xx_i2c_get_bus(soc, 6), "tmp105", 0x48);
+ i2c_slave_create_simple_orphan(npcm8xx_i2c_get_bus(soc, 6), "tmp105", 0x48);
}
static void npcm845_evb_fan_init(NPCM8xxMachine *machine, NPCM8xxState *soc)
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index 0642e35dd2..f37ddf8073 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -321,7 +321,7 @@ static void realview_init(MachineState *machine,
dev = sysbus_create_simple_orphan(TYPE_ARM_SBCON_I2C, 0x10002000, NULL);
i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
- i2c_slave_create_simple(i2c, "ds1338", 0x68);
+ i2c_slave_create_simple_orphan(i2c, "ds1338", 0x68);
/* Memory map for RealView Emulation Baseboard: */
/* 0x10000000 System registers. */
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index 3f72cedf2e..f9d2a61f9c 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1209,7 +1209,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
if (board->peripherals & BP_OLED_I2C) {
I2CBus *bus = (I2CBus *)qdev_get_child_bus(i2c_dev[0], "i2c");
- i2c_slave_create_simple(bus, "ssd0303", 0x3d);
+ i2c_slave_create_simple_orphan(bus, "ssd0303", 0x3d);
}
for (i = 0; i < NUM_UART; i++) {
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index 81bd397b5d..dcc7b7debd 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -341,7 +341,7 @@ static void versatile_init(MachineState *machine, int board_id)
dev = sysbus_create_simple_orphan(TYPE_ARM_SBCON_I2C, 0x10002000, NULL);
i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
- i2c_slave_create_simple(i2c, "ds1338", 0x68);
+ i2c_slave_create_simple_orphan(i2c, "ds1338", 0x68);
/* Add PL041 AACI Interface to the LM4549 codec */
pl041 = qdev_new_orphan("pl041");
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index 5a0012cb4f..ffd3c52d4f 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -653,7 +653,7 @@ static void vexpress_common_init(MachineState *machine)
dev = sysbus_create_simple_orphan(TYPE_ARM_SBCON_I2C, map[VE_SERIALDVI], NULL);
i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
- i2c_slave_create_simple(i2c, "sii9022", 0x39);
+ i2c_slave_create_simple_orphan(i2c, "sii9022", 0x39);
sysbus_create_simple_orphan("pl031", map[VE_RTC], pic[4]); /* RTC */
diff --git a/hw/display/sii9022.c b/hw/display/sii9022.c
index d00d3e9fc5..0bf49195d7 100644
--- a/hw/display/sii9022.c
+++ b/hw/display/sii9022.c
@@ -164,7 +164,7 @@ static void sii9022_realize(DeviceState *dev, Error **errp)
I2CBus *bus;
bus = I2C_BUS(qdev_get_parent_bus(dev));
- i2c_slave_create_simple(bus, TYPE_I2CDDC, 0x50);
+ i2c_slave_create_simple_orphan(bus, TYPE_I2CDDC, 0x50);
}
static void sii9022_class_init(ObjectClass *klass, const void *data)
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
index 27afcaecee..ac09e5f706 100644
--- a/hw/i2c/aspeed_i2c.c
+++ b/hw/i2c/aspeed_i2c.c
@@ -1518,7 +1518,7 @@ static void aspeed_i2c_bus_realize(DeviceState *dev, Error **errp)
sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq);
s->bus = i2c_init_bus(dev, s->name);
- s->slave = i2c_slave_create_simple(s->bus, TYPE_ASPEED_I2C_BUS_SLAVE,
+ s->slave = i2c_slave_create_simple_orphan(s->bus, TYPE_ASPEED_I2C_BUS_SLAVE,
0xff);
memory_region_init_io(&s->mr, OBJECT(s), &aspeed_i2c_bus_ops,
diff --git a/hw/i2c/core.c b/hw/i2c/core.c
index 7803f6113c..fba21fdfad 100644
--- a/hw/i2c/core.c
+++ b/hw/i2c/core.c
@@ -364,7 +364,7 @@ const VMStateDescription vmstate_i2c_slave = {
}
};
-I2CSlave *i2c_slave_new(const char *name, uint8_t addr)
+I2CSlave *i2c_slave_new_orphan(const char *name, uint8_t addr)
{
DeviceState *dev;
@@ -373,14 +373,34 @@ I2CSlave *i2c_slave_new(const char *name, uint8_t addr)
return I2C_SLAVE(dev);
}
+I2CSlave *i2c_slave_new(Object *parent, const char *id,
+ const char *type, uint8_t addr)
+{
+ DeviceState *dev;
+
+ dev = qdev_new(parent, id, type);
+ qdev_prop_set_uint8(dev, "address", addr);
+ return I2C_SLAVE(dev);
+}
+
+I2CSlave *i2c_slave_create_simple(Object *parent, const char *id,
+ I2CBus *bus, const char *type,
+ uint8_t addr)
+{
+ I2CSlave *dev = i2c_slave_new(parent, id, type, addr);
+
+ qdev_realize(DEVICE(dev), BUS(bus), &error_abort);
+ return dev;
+}
+
bool i2c_slave_realize_and_unref(I2CSlave *dev, I2CBus *bus, Error **errp)
{
return qdev_realize_and_unref(&dev->qdev, &bus->qbus, errp);
}
-I2CSlave *i2c_slave_create_simple(I2CBus *bus, const char *name, uint8_t addr)
+I2CSlave *i2c_slave_create_simple_orphan(I2CBus *bus, const char *name, uint8_t addr)
{
- I2CSlave *dev = i2c_slave_new(name, addr);
+ I2CSlave *dev = i2c_slave_new_orphan(name, addr);
i2c_slave_realize_and_unref(dev, bus, &error_abort);
diff --git a/hw/i3c/core.c b/hw/i3c/core.c
index 2fb865490e..469d66f1fb 100644
--- a/hw/i3c/core.c
+++ b/hw/i3c/core.c
@@ -623,7 +623,7 @@ void legacy_i2c_end_transfer(I3CBus *bus)
I2CSlave *legacy_i2c_device_create_simple(I3CBus *bus, const char *name,
uint8_t addr)
{
- I2CSlave *dev = i2c_slave_new(name, addr);
+ I2CSlave *dev = i2c_slave_new_orphan(name, addr);
i2c_slave_realize_and_unref(dev, bus->i2c_bus, &error_abort);
return dev;
diff --git a/hw/nvram/eeprom_at24c.c b/hw/nvram/eeprom_at24c.c
index 8b7f2dc13f..b6d314447c 100644
--- a/hw/nvram/eeprom_at24c.c
+++ b/hw/nvram/eeprom_at24c.c
@@ -148,7 +148,7 @@ I2CSlave *at24c_eeprom_init_rom(I2CBus *bus, uint8_t address, uint32_t rom_size,
{
EEPROMState *s;
- s = AT24C_EE(i2c_slave_new(TYPE_AT24C_EE, address));
+ s = AT24C_EE(i2c_slave_new_orphan(TYPE_AT24C_EE, address));
qdev_prop_set_uint32(DEVICE(s), "rom-size", rom_size);
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 05c305b72c..85977c8b69 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -1025,7 +1025,7 @@ void ppce500_init(MachineState *machine)
memory_region_add_subregion(ccsr_addr_space, MPC8544_I2C_REGS_OFFSET,
sysbus_mmio_get_region(s, 0));
i2c = I2C_BUS(qdev_get_child_bus(dev, "i2c"));
- i2c_slave_create_simple(i2c, "ds1338", RTC_REGS_OFFSET);
+ i2c_slave_create_simple_orphan(i2c, "ds1338", RTC_REGS_OFFSET);
/* eSDHC */
if (pmc->has_esdhc) {
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 8346613a68..0a22d854d7 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -2825,7 +2825,7 @@ static void pnv_rainier_i2c_init(PnvMachineState *pnv)
* Add a PCA9552 I2C device for PCIe hotplug control
* to engine 2, bus 1, address 0x63
*/
- I2CSlave *dev = i2c_slave_create_simple(chip10->i2c[2].busses[1],
+ I2CSlave *dev = i2c_slave_create_simple_orphan(chip10->i2c[2].busses[1],
"pca9552", 0x63);
/*
@@ -2843,7 +2843,7 @@ static void pnv_rainier_i2c_init(PnvMachineState *pnv)
* Add a PCA9554 I2C device for cable card presence detection
* to engine 2, bus 1, address 0x25
*/
- i2c_slave_create_simple(chip10->i2c[2].busses[1], "pca9554", 0x25);
+ i2c_slave_create_simple_orphan(chip10->i2c[2].busses[1], "pca9554", 0x25);
}
}
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 0c4c6f6256..767a5eb596 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -345,7 +345,7 @@ static void sam460ex_init(MachineState *machine)
spd_data[20] = 4; /* SO-DIMM module */
smbus_eeprom_init_one(i2c, 0x50, spd_data);
/* RTC */
- i2c_slave_create_simple(i2c, "m41t80", 0x68);
+ i2c_slave_create_simple_orphan(i2c, "m41t80", 0x68);
dev = sysbus_create_simple_orphan(TYPE_PPC4xx_I2C, 0x4ef600800,
qdev_get_gpio_in(uic[0], 3));
diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c
index beaf64e0c1..c3be7eb913 100644
--- a/hw/riscv/tt_atlantis.c
+++ b/hw/riscv/tt_atlantis.c
@@ -575,8 +575,8 @@ static void tt_atlantis_machine_init(MachineState *machine)
}
/* I2C peripherals: qemu specific */
- i2c_slave_create_simple(i2c_get_bus(s, 0), "ds1338", 0x6f);
- i2c_slave_create_simple(i2c_get_bus(s, 4), "tmp105", 0x48);
+ i2c_slave_create_simple_orphan(i2c_get_bus(s, 0), "ds1338", 0x6f);
+ i2c_slave_create_simple_orphan(i2c_get_bus(s, 4), "tmp105", 0x48);
/* Load or create device tree */
if (machine->dtb) {
diff --git a/include/hw/arm/aspeed.h b/include/hw/arm/aspeed.h
index a00238ed74..e1c0323cb6 100644
--- a/include/hw/arm/aspeed.h
+++ b/include/hw/arm/aspeed.h
@@ -83,7 +83,7 @@ void aspeed_machine_class_init_cpus_defaults(MachineClass *mc);
*
* Create and attach a PCA9552 LED controller device to the specified I2C bus
* of the given Aspeed SoC. The device is instantiated using
- * i2c_slave_create_simple() with the PCA9552 device type.
+ * i2c_slave_create_simple_orphan() with the PCA9552 device type.
*/
void aspeed_create_pca9552(AspeedSoCState *soc, int bus_id, int addr);
@@ -95,7 +95,7 @@ void aspeed_create_pca9552(AspeedSoCState *soc, int bus_id, int addr);
*
* Create and attach a PCA9554 I/O expander to the specified I2C bus
* of the given Aspeed SoC. The device is created via
- * i2c_slave_create_simple() and returned as an #I2CSlave pointer.
+ * i2c_slave_create_simple_orphan() and returned as an #I2CSlave pointer.
*
* Returns: a pointer to the newly created #I2CSlave instance.
*/
diff --git a/include/hw/i2c/i2c.h b/include/hw/i2c/i2c.h
index bcdc4f21a9..0bba1a7c20 100644
--- a/include/hw/i2c/i2c.h
+++ b/include/hw/i2c/i2c.h
@@ -163,7 +163,20 @@ bool i2c_scan_bus(I2CBus *bus, uint8_t address, bool broadcast,
* properties to be set. Type @name must exist. The device still
* needs to be realized. See qdev-core.h.
*/
-I2CSlave *i2c_slave_new(const char *name, uint8_t addr);
+I2CSlave *i2c_slave_new_orphan(const char *name, uint8_t addr);
+
+/**
+ * Create a parented I2C slave device on the heap.
+ * @parent: the QOM parent
+ * @id: child<> property name
+ * @type: I2C slave device type name
+ * @addr: I2C address of the slave when put on a bus
+ *
+ * Like i2c_slave_new_orphan(), but the returned device is owned by
+ * @parent's child<> property. Pair with qdev_realize().
+ */
+I2CSlave *i2c_slave_new(Object *parent, const char *id,
+ const char *type, uint8_t addr);
/**
* Create and realize an I2C slave device on the heap.
@@ -174,7 +187,24 @@ I2CSlave *i2c_slave_new(const char *name, uint8_t addr);
* Create the device state structure, initialize it, put it on the
* specified @bus, and drop the reference to it (the device is realized).
*/
-I2CSlave *i2c_slave_create_simple(I2CBus *bus, const char *name, uint8_t addr);
+I2CSlave *i2c_slave_create_simple_orphan(I2CBus *bus, const char *name,
+ uint8_t addr);
+
+/**
+ * Create, parent and realize an I2C slave device on the heap.
+ * @parent: the QOM parent
+ * @id: child<> property name
+ * @bus: I2C bus to put it on
+ * @type: I2C slave device type name
+ * @addr: I2C address of the slave when put on a bus
+ *
+ * Create the device state structure, add it as a child of @parent,
+ * put it on the specified @bus and realize it. The returned device
+ * is owned by @parent.
+ */
+I2CSlave *i2c_slave_create_simple(Object *parent, const char *id,
+ I2CBus *bus, const char *type,
+ uint8_t addr);
/**
* Realize and drop a reference an I2C slave device
@@ -189,10 +219,10 @@ I2CSlave *i2c_slave_create_simple(I2CBus *bus, const char *name, uint8_t addr);
* reference to it.
*
* This function is useful if you have created @dev via qdev_new_orphan(),
- * i2c_slave_new() or i2c_slave_try_new() (which take a reference to
+ * i2c_slave_new_orphan() or i2c_slave_try_new() (which take a reference to
* the device it returns to you), so that you can set properties on it
* before realizing it. If you don't need to set properties then
- * i2c_slave_create_simple() is probably better (as it does the create,
+ * i2c_slave_create_simple_orphan() is probably better (as it does the create,
* init and realize in one step).
*
* If you are embedding the I2C slave into another QOM device and
diff --git a/scripts/coccinelle/qom-parent/i2c-slave-new-orphan.cocci b/scripts/coccinelle/qom-parent/i2c-slave-new-orphan.cocci
new file mode 100644
index 0000000000..fdfb6a84c8
--- /dev/null
+++ b/scripts/coccinelle/qom-parent/i2c-slave-new-orphan.cocci
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+//
+// Rename i2c_slave_new()/i2c_slave_create_simple() to *_orphan()
+// so that the short names can be reintroduced with a mandatory
+// (parent, id, ...) signature.
+//
+// spatch --sp-file scripts/coccinelle/qom-parent/i2c-slave-new-orphan.cocci \
+// --in-place --include-headers --dir .
+
+@@
+@@
+- i2c_slave_new
++ i2c_slave_new_orphan
+
+@@
+@@
+- i2c_slave_create_simple
++ i2c_slave_create_simple_orphan
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 008/134] ssi, usb: Make bus-layer creators take a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (6 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 007/134] i2c: Make i2c_slave_new()/i2c_slave_create_simple() " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 009/134] cpu: Make cpu_create() " Alexander Graf
` (126 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Apply the rename-and-reintroduce treatment to the remaining
bus-layer helpers that wrap qdev_new_orphan():
ssi_create_peripheral() -> ssi_create_peripheral_orphan()
usb_create_simple() -> usb_create_simple_orphan()
and reintroduce the short names with a leading (parent, id, ...)
pair. Also add a usb_new(parent, id, type) helper for callers that
need to set properties before realize.
sd-bus, apple-desktop-bus, HDA, aux-bus and spapr-vio have no bus-
layer creation wrapper: their onboard devices are open-coded via
qdev_new_orphan() at each call site and will be converted directly
to qdev_new(parent, id, type) in the per-subdirectory conversion
patches.
The mechanical rename part is generated by
spatch --sp-file scripts/coccinelle/qom-parent/ssi-usb-orphan.cocci \
--in-place --include-headers --dir .
or equivalently
git ls-files '*.[ch]' '*.[ch].inc' '*.rst' '*.py' | \
grep -v '^subprojects/' | \
xargs sed -i \
's/\bssi_create_peripheral\b/&_orphan/g;
s/\busb_create_simple\b/&_orphan/g'
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/stellaris.c | 2 +-
hw/hppa/machine.c | 4 ++--
hw/mips/loongson3_virt.c | 4 ++--
hw/ppc/mac_newworld.c | 4 ++--
hw/ppc/sam460ex.c | 4 ++--
hw/ppc/spapr.c | 4 ++--
hw/riscv/sifive_u.c | 2 +-
hw/sh4/r2d.c | 2 +-
hw/ssi/ssi.c | 11 ++++++++++-
hw/vmapple/vmapple.c | 4 ++--
include/hw/ssi/ssi.h | 6 ++++--
include/hw/usb/usb.h | 18 +++++++++++++++++-
.../coccinelle/qom-parent/ssi-usb-orphan.cocci | 18 ++++++++++++++++++
13 files changed, 64 insertions(+), 19 deletions(-)
create mode 100644 scripts/coccinelle/qom-parent/ssi-usb-orphan.cocci
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index f9d2a61f9c..7a18d98477 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1300,7 +1300,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
* - Make the ssd0323 OLED controller chipselect active-low
*/
bus = qdev_get_child_bus(dev, "ssi");
- sddev = ssi_create_peripheral(bus, "ssi-sd");
+ sddev = ssi_create_peripheral_orphan(bus, "ssi-sd");
dinfo = drive_get(IF_SD, 0, 0);
blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 91fe4845c4..44dab9225a 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -446,8 +446,8 @@ static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
- usb_create_simple(usb_bus, "usb-kbd");
- usb_create_simple(usb_bus, "usb-mouse");
+ usb_create_simple_orphan(usb_bus, "usb-kbd");
+ usb_create_simple_orphan(usb_bus, "usb-mouse");
}
/* register power switch emulation */
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index 1729eb1c0b..f43c231004 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -468,8 +468,8 @@ static inline void loongson3_virt_devices_init(MachineState *machine,
pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
- usb_create_simple(usb_bus, "usb-kbd");
- usb_create_simple(usb_bus, "usb-tablet");
+ usb_create_simple_orphan(usb_bus, "usb-kbd");
+ usb_create_simple_orphan(usb_bus, "usb-tablet");
}
pci_init_nic_devices(pci_bus, mc->default_nic);
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index 0df953b9e1..72baeef60a 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -425,8 +425,8 @@ static void ppc_core99_init(MachineState *machine)
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
- usb_create_simple(usb_bus, "usb-kbd");
- usb_create_simple(usb_bus, "usb-mouse");
+ usb_create_simple_orphan(usb_bus, "usb-kbd");
+ usb_create_simple_orphan(usb_bus, "usb-mouse");
}
}
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 767a5eb596..39e704dfaa 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -398,8 +398,8 @@ static void sam460ex_init(MachineState *machine)
sysbus_connect_irq(sbdev, 0, qdev_get_gpio_in(uic[2], 30));
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
- usb_create_simple(usb_bus, "usb-kbd");
- usb_create_simple(usb_bus, "usb-mouse");
+ usb_create_simple_orphan(usb_bus, "usb-kbd");
+ usb_create_simple_orphan(usb_bus, "usb-mouse");
/* PCIe buses */
dev = qdev_new_orphan(TYPE_PPC460EX_PCIE_HOST);
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 4ead6ba664..e09b529ebc 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -3082,8 +3082,8 @@ static void spapr_machine_init(MachineState *machine)
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
- usb_create_simple(usb_bus, "usb-kbd");
- usb_create_simple(usb_bus, "usb-mouse");
+ usb_create_simple_orphan(usb_bus, "usb-kbd");
+ usb_create_simple_orphan(usb_bus, "usb-mouse");
}
}
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index db6d984f94..47ce75ef11 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -606,7 +606,7 @@ static void sifive_u_machine_init(MachineState *machine)
sysbus_connect_irq(SYS_BUS_DEVICE(&s->soc.spi0), 1, flash_cs);
/* Connect an SD card to SPI2 */
- sd_dev = ssi_create_peripheral(s->soc.spi2.spi, "ssi-sd");
+ sd_dev = ssi_create_peripheral_orphan(s->soc.spi2.spi, "ssi-sd");
sd_cs = qdev_get_gpio_in_named(sd_dev, SSI_GPIO_CS, 0);
sysbus_connect_irq(SYS_BUS_DEVICE(&s->soc.spi2), 1, sd_cs);
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index 0b502ca392..6f8d270fae 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -320,7 +320,7 @@ static void r2d_init(MachineState *machine)
/* USB keyboard */
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
- usb_create_simple(usb_bus, "usb-kbd");
+ usb_create_simple_orphan(usb_bus, "usb-kbd");
/* Todo: register on board registers */
memset(&boot_params, 0, sizeof(boot_params));
diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
index b1935271f0..6031cde7b0 100644
--- a/hw/ssi/ssi.c
+++ b/hw/ssi/ssi.c
@@ -138,7 +138,16 @@ bool ssi_realize_and_unref(DeviceState *dev, SSIBus *bus, Error **errp)
return qdev_realize_and_unref(dev, &bus->parent_obj, errp);
}
-DeviceState *ssi_create_peripheral(SSIBus *bus, const char *name)
+DeviceState *ssi_create_peripheral(Object *parent, const char *id,
+ SSIBus *bus, const char *type)
+{
+ DeviceState *dev = qdev_new(parent, id, type);
+
+ qdev_realize(dev, BUS(bus), &error_fatal);
+ return dev;
+}
+
+DeviceState *ssi_create_peripheral_orphan(SSIBus *bus, const char *name)
{
DeviceState *dev = qdev_new_orphan(name);
diff --git a/hw/vmapple/vmapple.c b/hw/vmapple/vmapple.c
index bf19faa04a..4d218748c2 100644
--- a/hw/vmapple/vmapple.c
+++ b/hw/vmapple/vmapple.c
@@ -425,8 +425,8 @@ static void create_pcie(VMAppleMachineState *vms)
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_fatal));
- usb_create_simple(usb_bus, "usb-kbd");
- usb_create_simple(usb_bus, "usb-tablet");
+ usb_create_simple_orphan(usb_bus, "usb-kbd");
+ usb_create_simple_orphan(usb_bus, "usb-tablet");
}
}
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
index 153bf0cb9c..36ed002281 100644
--- a/include/hw/ssi/ssi.h
+++ b/include/hw/ssi/ssi.h
@@ -81,7 +81,9 @@ extern const VMStateDescription vmstate_ssi_peripheral;
.offset = vmstate_offset_value(_state, _field, SSIPeripheral), \
}
-DeviceState *ssi_create_peripheral(SSIBus *bus, const char *name);
+DeviceState *ssi_create_peripheral(Object *parent, const char *id,
+ SSIBus *bus, const char *type);
+DeviceState *ssi_create_peripheral_orphan(SSIBus *bus, const char *name);
/**
* ssi_realize_and_unref: realize and unref an SSI peripheral
* @dev: SSI peripheral to realize
@@ -95,7 +97,7 @@ DeviceState *ssi_create_peripheral(SSIBus *bus, const char *name);
* This function is useful if you have created @dev via qdev_new_orphan()
* (which takes a reference to the device it returns to you), so that
* you can set properties on it before realizing it. If you don't need
- * to set properties then ssi_create_peripheral() is probably better (as it
+ * to set properties then ssi_create_peripheral_orphan() is probably better (as it
* does the create, init and realize in one step).
*
* If you are embedding the SSI peripheral into another QOM device and
diff --git a/include/hw/usb/usb.h b/include/hw/usb/usb.h
index 6ef190523f..1ae1f40aa9 100644
--- a/include/hw/usb/usb.h
+++ b/include/hw/usb/usb.h
@@ -584,7 +584,23 @@ static inline bool usb_realize_and_unref(USBDevice *dev, USBBus *bus, Error **er
return qdev_realize_and_unref(&dev->qdev, &bus->qbus, errp);
}
-static inline USBDevice *usb_create_simple(USBBus *bus, const char *name)
+static inline USBDevice *usb_new(Object *parent, const char *id,
+ const char *type)
+{
+ return USB_DEVICE(qdev_new(parent, id, type));
+}
+
+static inline USBDevice *usb_create_simple(Object *parent, const char *id,
+ USBBus *bus, const char *type)
+{
+ USBDevice *dev = usb_new(parent, id, type);
+
+ qdev_realize(DEVICE(dev), BUS(bus), &error_abort);
+ return dev;
+}
+
+static inline USBDevice *usb_create_simple_orphan(USBBus *bus,
+ const char *name)
{
USBDevice *dev = USB_DEVICE(qdev_new_orphan(name));
diff --git a/scripts/coccinelle/qom-parent/ssi-usb-orphan.cocci b/scripts/coccinelle/qom-parent/ssi-usb-orphan.cocci
new file mode 100644
index 0000000000..7d201536d8
--- /dev/null
+++ b/scripts/coccinelle/qom-parent/ssi-usb-orphan.cocci
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+//
+// Rename ssi_create_peripheral()/usb_create_simple() to *_orphan()
+// so that the short names can be reintroduced with a mandatory
+// (parent, id, ...) signature.
+//
+// spatch --sp-file scripts/coccinelle/qom-parent/ssi-usb-orphan.cocci \
+// --in-place --include-headers --dir .
+
+@@
+@@
+- ssi_create_peripheral
++ ssi_create_peripheral_orphan
+
+@@
+@@
+- usb_create_simple
++ usb_create_simple_orphan
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 009/134] cpu: Make cpu_create() take a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (7 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 008/134] ssi, usb: Make bus-layer creators " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 010/134] hw/avr: Give onboard devices " Alexander Graf
` (125 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
CPUs are the single largest source of orphans in /machine/unattached
because virtually every board that isn't SoC-based creates them via
cpu_create(), which calls object_new() with no parent. This is also
where the user-visible garbage in query-cpus-fast comes from: qom_path
reads /machine/unattached/device[N] instead of /machine/cpu[N].
Apply the same rename-and-reintroduce treatment: mechanically rename
cpu_create() to cpu_create_orphan() and reintroduce cpu_create()
with a leading (parent, id, ...) pair built on object_new_child().
On realize failure the parented variant unparents (rather than
unrefs) since the sole reference is held by the parent.
The mechanical rename part is generated by
spatch --sp-file \
scripts/coccinelle/qom-parent/cpu-create-orphan.cocci \
--in-place --include-headers --dir .
or equivalently
git ls-files '*.[ch]' '*.[ch].inc' '*.rst' '*.py' | \
grep -v '^subprojects/' | \
xargs sed -i 's/\bcpu_create\b/cpu_create_orphan/g'
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
bsd-user/main.c | 2 +-
hw/alpha/dp264.c | 2 +-
hw/arm/musicpal.c | 2 +-
hw/arm/omap1.c | 2 +-
hw/arm/strongarm.c | 2 +-
hw/core/cpu-common.c | 14 +++++++++++++-
hw/core/null-machine.c | 2 +-
hw/hppa/machine.c | 2 +-
hw/m68k/an5206.c | 2 +-
hw/m68k/mcf5208.c | 2 +-
hw/m68k/next-cube.c | 2 +-
hw/m68k/virt.c | 2 +-
hw/or1k/or1k-sim.c | 2 +-
hw/or1k/virt.c | 2 +-
hw/ppc/amigaone.c | 2 +-
hw/ppc/mac_newworld.c | 2 +-
hw/ppc/mac_oldworld.c | 2 +-
hw/ppc/pegasos.c | 2 +-
hw/ppc/ppc440_bamboo.c | 2 +-
hw/ppc/prep.c | 2 +-
hw/ppc/sam460ex.c | 2 +-
hw/ppc/virtex_ml507.c | 2 +-
hw/sh4/r2d.c | 2 +-
hw/tricore/tricore_testboard.c | 2 +-
hw/xtensa/sim.c | 2 +-
hw/xtensa/xtfpga.c | 2 +-
include/hw/core/cpu.h | 15 ++++++++++++++-
linux-user/main.c | 4 ++--
.../coccinelle/qom-parent/cpu-create-orphan.cocci | 13 +++++++++++++
29 files changed, 67 insertions(+), 29 deletions(-)
create mode 100644 scripts/coccinelle/qom-parent/cpu-create-orphan.cocci
diff --git a/bsd-user/main.c b/bsd-user/main.c
index 4f1544342e..618b1adf4d 100644
--- a/bsd-user/main.c
+++ b/bsd-user/main.c
@@ -475,7 +475,7 @@ int main(int argc, char **argv)
set_preferred_target_page_bits(ctz32(host_page_size));
finalize_target_page_bits();
- cpu = cpu_create(cpu_type);
+ cpu = cpu_create_orphan(cpu_type);
env = cpu_env(cpu);
cpu_reset(cpu);
thread_cpu = cpu;
diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index b07dcebaa0..512b270838 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -65,7 +65,7 @@ static void clipper_init(MachineState *machine)
/* Create up to 4 cpus. */
memset(cpus, 0, sizeof(cpus));
for (i = 0; i < smp_cpus; ++i) {
- cpus[i] = ALPHA_CPU(cpu_create(machine->cpu_type));
+ cpus[i] = ALPHA_CPU(cpu_create_orphan(machine->cpu_type));
}
/*
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index baab159bfd..a07359813e 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1232,7 +1232,7 @@ static void musicpal_init(MachineState *machine)
exit(EXIT_FAILURE);
}
- cpu = ARM_CPU(cpu_create(machine->cpu_type));
+ cpu = ARM_CPU(cpu_create_orphan(machine->cpu_type));
memory_region_add_subregion(address_space_mem, 0, machine->ram);
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index 9115d12fad..eefa2e441a 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -3749,7 +3749,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
MemoryRegion *system_memory = get_system_memory();
/* Core */
- s->cpu = ARM_CPU(cpu_create(cpu_type));
+ s->cpu = ARM_CPU(cpu_create_orphan(cpu_type));
s->sdram_size = memory_region_size(dram);
s->sram_size = OMAP15XX_SRAM_SIZE;
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
index f67aaa23ed..1704db8baa 100644
--- a/hw/arm/strongarm.c
+++ b/hw/arm/strongarm.c
@@ -1620,7 +1620,7 @@ StrongARMState *sa1110_init(const char *cpu_type)
exit(1);
}
- s->cpu = ARM_CPU(cpu_create(cpu_type));
+ s->cpu = ARM_CPU(cpu_create_orphan(cpu_type));
s->pic = sysbus_create_varargs_orphan("strongarm_pic", 0x90050000,
qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_IRQ),
diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
index e314f916f8..eef243c1ad 100644
--- a/hw/core/cpu-common.c
+++ b/hw/core/cpu-common.c
@@ -56,7 +56,19 @@ bool cpu_exists(int64_t id)
return !!cpu_by_arch_id(id);
}
-CPUState *cpu_create(const char *typename)
+CPUState *cpu_create(Object *parent, const char *id, const char *typename)
+{
+ Error *err = NULL;
+ CPUState *cpu = CPU(object_new_child(parent, id, typename));
+ if (!qdev_realize(DEVICE(cpu), NULL, &err)) {
+ error_report_err(err);
+ object_unparent(OBJECT(cpu));
+ exit(EXIT_FAILURE);
+ }
+ return cpu;
+}
+
+CPUState *cpu_create_orphan(const char *typename)
{
Error *err = NULL;
CPUState *cpu = CPU(object_new(typename));
diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
index f132a7b89b..7cc4b9ab3b 100644
--- a/hw/core/null-machine.c
+++ b/hw/core/null-machine.c
@@ -25,7 +25,7 @@ static void machine_none_init(MachineState *mch)
/* Initialize CPU (if user asked for it) */
if (mch->cpu_type) {
- cpu = cpu_create(mch->cpu_type);
+ cpu = cpu_create_orphan(mch->cpu_type);
if (!cpu) {
error_report("Unable to initialize CPU");
exit(1);
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 44dab9225a..a4b8e9ee77 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -298,7 +298,7 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine)
/* Create CPUs. */
for (unsigned int i = 0; i < smp_cpus; i++) {
- cpu[i] = HPPA_CPU(cpu_create(machine->cpu_type));
+ cpu[i] = HPPA_CPU(cpu_create_orphan(machine->cpu_type));
}
/* Initialize memory */
diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
index f29c3b5226..b649605140 100644
--- a/hw/m68k/an5206.c
+++ b/hw/m68k/an5206.c
@@ -46,7 +46,7 @@ static void an5206_init(MachineState *machine)
MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *sram = g_new(MemoryRegion, 1);
- cpu = M68K_CPU(cpu_create(machine->cpu_type));
+ cpu = M68K_CPU(cpu_create_orphan(machine->cpu_type));
env = &cpu->env;
/* Initialize CPU registers. */
diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
index a8068c91f2..d79ec173e6 100644
--- a/hw/m68k/mcf5208.c
+++ b/hw/m68k/mcf5208.c
@@ -288,7 +288,7 @@ static void mcf5208evb_init(MachineState *machine)
MemoryRegion *sram = g_new(MemoryRegion, 1);
DeviceState *intc;
- cpu = M68K_CPU(cpu_create(machine->cpu_type));
+ cpu = M68K_CPU(cpu_create_orphan(machine->cpu_type));
env = &cpu->env;
/* Initialize CPU registers. */
diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c
index 0c1f5b4481..d97168d9f3 100644
--- a/hw/m68k/next-cube.c
+++ b/hw/m68k/next-cube.c
@@ -1260,7 +1260,7 @@ static void next_cube_init(MachineState *machine)
DeviceState *pcdev;
/* Initialize the cpu core */
- cpu = M68K_CPU(cpu_create(machine->cpu_type));
+ cpu = M68K_CPU(cpu_create_orphan(machine->cpu_type));
if (!cpu) {
error_report("Unable to find m68k CPU definition");
exit(1);
diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c
index e2af0196e8..64ac8c8166 100644
--- a/hw/m68k/virt.c
+++ b/hw/m68k/virt.c
@@ -145,7 +145,7 @@ static void virt_init(MachineState *machine)
reset_info = g_new0(ResetInfo, 1);
/* init CPUs */
- cpu = M68K_CPU(cpu_create(machine->cpu_type));
+ cpu = M68K_CPU(cpu_create_orphan(machine->cpu_type));
reset_info->cpu = cpu;
qemu_register_reset(main_cpu_reset, reset_info);
diff --git a/hw/or1k/or1k-sim.c b/hw/or1k/or1k-sim.c
index bd668d0e47..6962313315 100644
--- a/hw/or1k/or1k-sim.c
+++ b/hw/or1k/or1k-sim.c
@@ -299,7 +299,7 @@ static void openrisc_sim_init(MachineState *machine)
assert(smp_cpus >= 1 && smp_cpus <= OR1KSIM_CPUS_MAX);
for (n = 0; n < smp_cpus; n++) {
- cpus[n] = OPENRISC_CPU(cpu_create(machine->cpu_type));
+ cpus[n] = OPENRISC_CPU(cpu_create_orphan(machine->cpu_type));
if (cpus[n] == NULL) {
fprintf(stderr, "Unable to find CPU definition!\n");
exit(1);
diff --git a/hw/or1k/virt.c b/hw/or1k/virt.c
index 9451a0b7df..f222efafde 100644
--- a/hw/or1k/virt.c
+++ b/hw/or1k/virt.c
@@ -481,7 +481,7 @@ static void openrisc_virt_init(MachineState *machine)
assert(smp_cpus >= 1 && smp_cpus <= VIRT_CPUS_MAX);
for (n = 0; n < smp_cpus; n++) {
- cpus[n] = OPENRISC_CPU(cpu_create(machine->cpu_type));
+ cpus[n] = OPENRISC_CPU(cpu_create_orphan(machine->cpu_type));
if (cpus[n] == NULL) {
fprintf(stderr, "Unable to find CPU definition!\n");
exit(1);
diff --git a/hw/ppc/amigaone.c b/hw/ppc/amigaone.c
index c6b331ff16..80802d42c6 100644
--- a/hw/ppc/amigaone.c
+++ b/hw/ppc/amigaone.c
@@ -279,7 +279,7 @@ static void amigaone_init(MachineState *machine)
struct boot_info *bi = NULL;
/* init CPU */
- cpu = POWERPC_CPU(cpu_create(machine->cpu_type));
+ cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
env = &cpu->env;
if (PPC_INPUT(env) != PPC_FLAGS_INPUT_6xx) {
error_report("Incompatible CPU, only 6xx bus supported");
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index 72baeef60a..8c46ecd6d1 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -159,7 +159,7 @@ static void ppc_core99_init(MachineState *machine)
/* init CPUs */
for (i = 0; i < machine->smp.cpus; i++) {
- cpu = POWERPC_CPU(cpu_create(machine->cpu_type));
+ cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
env = &cpu->env;
/* Set time-base frequency to 100 Mhz */
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index e6c5830c38..4c5746b754 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -111,7 +111,7 @@ static void ppc_heathrow_init(MachineState *machine)
/* init CPUs */
for (i = 0; i < machine->smp.cpus; i++) {
- cpu = POWERPC_CPU(cpu_create(machine->cpu_type));
+ cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
env = &cpu->env;
/* Set time-base frequency to 16.6 Mhz */
diff --git a/hw/ppc/pegasos.c b/hw/ppc/pegasos.c
index 0030068ab3..bba73f60c8 100644
--- a/hw/ppc/pegasos.c
+++ b/hw/ppc/pegasos.c
@@ -163,7 +163,7 @@ static void pegasos_init(MachineState *machine)
uint8_t *spd_data;
/* init CPU */
- pm->cpu = POWERPC_CPU(cpu_create(machine->cpu_type));
+ pm->cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
env = &pm->cpu->env;
if (PPC_INPUT(env) != PPC_FLAGS_INPUT_6xx) {
error_report("Incompatible CPU, only 6xx bus supported");
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 7a6c3ebec5..68c7328129 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -148,7 +148,7 @@ static void bamboo_init(MachineState *machine)
exit(EXIT_FAILURE);
}
- cpu = POWERPC_CPU(cpu_create(machine->cpu_type));
+ cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
env = &cpu->env;
if (env->mmu_model != POWERPC_MMU_BOOKE) {
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 32a28bc12a..c861e022f0 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -257,7 +257,7 @@ static void ibm_40p_init(MachineState *machine)
}
/* init CPU */
- cpu = POWERPC_CPU(cpu_create(machine->cpu_type));
+ cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
env = &cpu->env;
if (PPC_INPUT(env) != PPC_FLAGS_INPUT_6xx) {
error_report("only 6xx bus is supported on this machine");
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 39e704dfaa..d23d2c2bd8 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -260,7 +260,7 @@ static void sam460ex_init(MachineState *machine)
uint8_t *spd_data;
int success;
- cpu = POWERPC_CPU(cpu_create(machine->cpu_type));
+ cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
env = &cpu->env;
if (env->mmu_model != POWERPC_MMU_BOOKE) {
error_report("Only MMU model BookE is supported by this machine.");
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index d7fd72d353..9163d8acf8 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -76,7 +76,7 @@ static PowerPCCPU *ppc440_init_xilinx(const char *cpu_type, uint32_t sysclk)
DeviceState *uicdev;
SysBusDevice *uicsbd;
- cpu = POWERPC_CPU(cpu_create(cpu_type));
+ cpu = POWERPC_CPU(cpu_create_orphan(cpu_type));
env = &cpu->env;
ppc_booke_timers_init(cpu, sysclk, 0/* no flags */);
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index 6f8d270fae..9f313a77cb 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -251,7 +251,7 @@ static void r2d_init(MachineState *machine)
USBBus *usb_bus;
r2d_fpga_t *fpga;
- cpu = SUPERH_CPU(cpu_create(machine->cpu_type));
+ cpu = SUPERH_CPU(cpu_create_orphan(machine->cpu_type));
env = &cpu->env;
reset_info = g_new0(ResetData, 1);
diff --git a/hw/tricore/tricore_testboard.c b/hw/tricore/tricore_testboard.c
index afed9ad0ae..69794d3445 100644
--- a/hw/tricore/tricore_testboard.c
+++ b/hw/tricore/tricore_testboard.c
@@ -67,7 +67,7 @@ static void tricore_testboard_init(MachineState *machine, int board_id)
MemoryRegion *pcp_data = g_new(MemoryRegion, 1);
MemoryRegion *pcp_text = g_new(MemoryRegion, 1);
- cpu = TRICORE_CPU(cpu_create(machine->cpu_type));
+ cpu = TRICORE_CPU(cpu_create_orphan(machine->cpu_type));
env = &cpu->env;
memory_region_init_ram(ext_cram, NULL, "powerlink_ext_c.ram",
2 * MiB, &error_fatal);
diff --git a/hw/xtensa/sim.c b/hw/xtensa/sim.c
index 835cd04fe0..17245a0388 100644
--- a/hw/xtensa/sim.c
+++ b/hw/xtensa/sim.c
@@ -63,7 +63,7 @@ XtensaCPU *xtensa_sim_common_init(MachineState *machine)
int n;
for (n = 0; n < machine->smp.cpus; n++) {
- cpu = XTENSA_CPU(cpu_create(machine->cpu_type));
+ cpu = XTENSA_CPU(cpu_create_orphan(machine->cpu_type));
env = &cpu->env;
env->sregs[PRID] = n;
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 4b1009a398..0ee7350945 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -250,7 +250,7 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
for (n = 0; n < smp_cpus; n++) {
CPUXtensaState *cenv = NULL;
- cpu = XTENSA_CPU(cpu_create(machine->cpu_type));
+ cpu = XTENSA_CPU(cpu_create_orphan(machine->cpu_type));
cenv = &cpu->env;
if (!env) {
env = cenv;
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index b54035fb13..1b2ec1ab1e 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -846,13 +846,26 @@ char *cpu_model_from_type(const char *typename);
/**
* cpu_create:
+ * @parent: the QOM parent (usually the machine or SoC container)
+ * @id: child<> property name, e.g. "cpu[0]" or "cpu[*]"
+ * @typename: the CPU type
+ *
+ * Instantiates a CPU as a child of @parent under @id and realizes it.
+ * The returned CPU is owned by @parent.
+ *
+ * Returns: A #CPUState. Failure to realize is fatal.
+ */
+CPUState *cpu_create(Object *parent, const char *id, const char *typename);
+
+/**
+ * cpu_create_orphan:
* @typename: The CPU type.
*
* Instantiates a CPU and realizes the CPU.
*
* Returns: A #CPUState or %NULL if an error occurred.
*/
-CPUState *cpu_create(const char *typename);
+CPUState *cpu_create_orphan(const char *typename);
/**
* parse_cpu_option:
diff --git a/linux-user/main.c b/linux-user/main.c
index c08c73fd80..53c7768a5e 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -237,7 +237,7 @@ void init_task_state(TaskState *ts)
CPUArchState *cpu_copy(CPUArchState *env)
{
CPUState *cpu = env_cpu(env);
- CPUState *new_cpu = cpu_create(cpu_type);
+ CPUState *new_cpu = cpu_create_orphan(cpu_type);
CPUArchState *new_env = cpu_env(new_cpu);
CPUBreakpoint *bp;
@@ -819,7 +819,7 @@ int main(int argc, char **argv, char **envp)
set_preferred_target_page_bits(ctz32(host_page_size));
finalize_target_page_bits();
- cpu = cpu_create(cpu_type);
+ cpu = cpu_create_orphan(cpu_type);
env = cpu_env(cpu);
cpu_reset(cpu);
thread_cpu = cpu;
diff --git a/scripts/coccinelle/qom-parent/cpu-create-orphan.cocci b/scripts/coccinelle/qom-parent/cpu-create-orphan.cocci
new file mode 100644
index 0000000000..c268c05b0c
--- /dev/null
+++ b/scripts/coccinelle/qom-parent/cpu-create-orphan.cocci
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+//
+// Rename cpu_create() to cpu_create_orphan() so that the short
+// name can be reintroduced with a mandatory (parent, id, type)
+// signature.
+//
+// spatch --sp-file scripts/coccinelle/qom-parent/cpu-create-orphan.cocci \
+// --in-place --include-headers --dir .
+
+@@
+@@
+- cpu_create
++ cpu_create_orphan
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 010/134] hw/avr: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (8 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 009/134] cpu: Make cpu_create() " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-13 8:25 ` Philippe Mathieu-Daudé
2026-07-11 22:35 ` [RFC PATCH 011/134] hw/tricore: " Alexander Graf
` (124 subsequent siblings)
134 siblings, 1 reply; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/avr to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
file:line | parent | name | rationale
atmega.c:287 | OBJECT(dev) | "io" | unimplemented I/O placeholder is a fixed child of the Atmega SoC; SoC realize() creates it, SoC owns it
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/avr/atmega.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/hw/avr/atmega.c b/hw/avr/atmega.c
index a85bdf929a..5eb640f628 100644
--- a/hw/avr/atmega.c
+++ b/hw/avr/atmega.c
@@ -284,10 +284,10 @@ static void atmega_realize(DeviceState *dev, Error **errp)
* 0x20 - 0x5f: I/O memory
* 0x60 - 0xff: Extended I/O
*/
- s->io = qdev_new_orphan(TYPE_UNIMPLEMENTED_DEVICE);
+ s->io = qdev_new(OBJECT(dev), "io", TYPE_UNIMPLEMENTED_DEVICE);
qdev_prop_set_string(s->io, "name", "I/O");
qdev_prop_set_uint64(s->io, "size", mc->io_size);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(s->io), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(s->io), &error_fatal);
sysbus_mmio_map_overlap(SYS_BUS_DEVICE(s->io), 0, OFFSET_DATA, -1234);
/* Power Reduction */
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 010/134] hw/avr: Give onboard devices a QOM parent
2026-07-11 22:35 ` [RFC PATCH 010/134] hw/avr: Give onboard devices " Alexander Graf
@ 2026-07-13 8:25 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 156+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-07-13 8:25 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
On 12/7/26 00:35, Alexander Graf wrote:
> Convert the *_orphan() device-creation calls in hw/avr to the new
> parented API introduced earlier in this series, so every onboard
> device gets a stable path in the composition tree instead of landing
> in /machine/unattached with an unstable device[N] name.
>
> The parent for each device is the object that owns its lifetime: the
> machine for board-created devices, the containing device for
> composite children. Names follow existing QOM conventions.
>
> Per-site rationale (reviewers: dispute the modeling here):
>
> file:line | parent | name | rationale
> atmega.c:287 | OBJECT(dev) | "io" | unimplemented I/O placeholder is a fixed child of the Atmega SoC; SoC realize() creates it, SoC owns it
>
> Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> hw/avr/atmega.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 011/134] hw/tricore: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (9 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 010/134] hw/avr: Give onboard devices " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 012/134] hw/xtensa: " Alexander Graf
` (123 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/tricore to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
file:line | parent | name | rationale
tricore_testboard.c:70 | OBJECT(machine) | "cpu" | single CPU created by board init(); machine owns it
tricore_testboard.c:92 | OBJECT(machine) | "testdevice" | onboard test device created by board init()
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/tricore/tricore_testboard.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/hw/tricore/tricore_testboard.c b/hw/tricore/tricore_testboard.c
index 69794d3445..9e8cccbd59 100644
--- a/hw/tricore/tricore_testboard.c
+++ b/hw/tricore/tricore_testboard.c
@@ -55,6 +55,7 @@ static void tricore_load_kernel(CPUTriCoreState *env)
static void tricore_testboard_init(MachineState *machine, int board_id)
{
+ Object *mo = OBJECT(machine);
TriCoreCPU *cpu;
CPUTriCoreState *env;
TriCoreTestDeviceState *test_dev;
@@ -67,7 +68,7 @@ static void tricore_testboard_init(MachineState *machine, int board_id)
MemoryRegion *pcp_data = g_new(MemoryRegion, 1);
MemoryRegion *pcp_text = g_new(MemoryRegion, 1);
- cpu = TRICORE_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = TRICORE_CPU(cpu_create(mo, "cpu", machine->cpu_type));
env = &cpu->env;
memory_region_init_ram(ext_cram, NULL, "powerlink_ext_c.ram",
2 * MiB, &error_fatal);
@@ -89,7 +90,9 @@ static void tricore_testboard_init(MachineState *machine, int board_id)
memory_region_add_subregion(sysmem, 0xf0050000, pcp_data);
memory_region_add_subregion(sysmem, 0xf0060000, pcp_text);
- test_dev = TRICORE_TESTDEVICE(qdev_new_orphan(TYPE_TRICORE_TESTDEVICE));
+ test_dev = TRICORE_TESTDEVICE(qdev_new(mo, "testdevice",
+ TYPE_TRICORE_TESTDEVICE));
+ sysbus_realize(SYS_BUS_DEVICE(test_dev), &error_fatal);
memory_region_add_subregion(sysmem, 0xf0000000, &test_dev->iomem);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 012/134] hw/xtensa: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (10 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 011/134] hw/tricore: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 013/134] hw/alpha: " Alexander Graf
` (122 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/xtensa to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
file:line | parent | name | rationale
sim.c:66 | OBJECT(machine) | "cpu[*]" | SMP CPUs created by board init(); machine owns them
virt.c:64 | OBJECT(ms) | "pcie" | GPEX PCIe host is a fixed onboard device of the virt machine; create_pcie() already receives MachineState
xtfpga.c:176 | OBJECT(machine) | "flash" | onboard CFI flash; thread an Object *parent argument through the static xtfpga_flash_init() helper from board init()
xtfpga.c:253 | OBJECT(machine) | "cpu[*]" | SMP CPUs created by board init()
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/xtensa/sim.c | 2 +-
hw/xtensa/virt.c | 4 ++--
hw/xtensa/xtfpga.c | 13 ++++++++-----
3 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/hw/xtensa/sim.c b/hw/xtensa/sim.c
index 17245a0388..ad1439a0b4 100644
--- a/hw/xtensa/sim.c
+++ b/hw/xtensa/sim.c
@@ -63,7 +63,7 @@ XtensaCPU *xtensa_sim_common_init(MachineState *machine)
int n;
for (n = 0; n < machine->smp.cpus; n++) {
- cpu = XTENSA_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = XTENSA_CPU(cpu_create(OBJECT(machine), "cpu[*]", machine->cpu_type));
env = &cpu->env;
env->sregs[PRID] = n;
diff --git a/hw/xtensa/virt.c b/hw/xtensa/virt.c
index e31b783b91..6b1271d0d5 100644
--- a/hw/xtensa/virt.c
+++ b/hw/xtensa/virt.c
@@ -61,8 +61,8 @@ static void create_pcie(MachineState *ms, CPUXtensaState *env, int irq_base,
qemu_irq *extints;
int i;
- dev = qdev_new_orphan(TYPE_GPEX_HOST);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(ms), "pcie", TYPE_GPEX_HOST);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
/* Map only the first size_ecam bytes of ECAM space. */
ecam_alias = g_new0(MemoryRegion, 1);
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 0ee7350945..07b791b9bf 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -168,12 +168,13 @@ static void xtfpga_net_init(MemoryRegion *address_space,
memory_region_add_subregion(address_space, buffers, ram);
}
-static PFlashCFI01 *xtfpga_flash_init(MemoryRegion *address_space,
+static PFlashCFI01 *xtfpga_flash_init(Object *parent,
+ MemoryRegion *address_space,
const XtfpgaBoardDesc *board,
DriveInfo *dinfo, int be)
{
SysBusDevice *s;
- DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new(parent, "flash", TYPE_PFLASH_CFI01);
qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
qdev_prop_set_uint32(dev, "num-blocks",
@@ -183,7 +184,7 @@ static PFlashCFI01 *xtfpga_flash_init(MemoryRegion *address_space,
qdev_prop_set_bit(dev, "big-endian", be);
qdev_prop_set_string(dev, "name", "xtfpga.io.flash");
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
memory_region_add_subregion(address_space, board->flash->base,
sysbus_mmio_get_region(s, 0));
return PFLASH_CFI01(dev);
@@ -250,7 +251,8 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
for (n = 0; n < smp_cpus; n++) {
CPUXtensaState *cenv = NULL;
- cpu = XTENSA_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = XTENSA_CPU(cpu_create(OBJECT(machine), "cpu[*]",
+ machine->cpu_type));
cenv = &cpu->env;
if (!env) {
env = cenv;
@@ -315,7 +317,8 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
dinfo = drive_get(IF_PFLASH, 0, 0);
if (dinfo) {
- flash = xtfpga_flash_init(system_io, board, dinfo, TARGET_BIG_ENDIAN);
+ flash = xtfpga_flash_init(OBJECT(machine), system_io, board, dinfo,
+ TARGET_BIG_ENDIAN);
}
/* Use presence of kernel file name as 'boot from SRAM' switch. */
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 013/134] hw/alpha: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (11 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 012/134] hw/xtensa: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 014/134] hw/nitro: " Alexander Graf
` (121 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/alpha to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
file:line | parent | name | rationale
dp264.c:68 | OBJECT(machine) | "cpu[*]" | SMP CPUs created by board init()
dp264.c:113 | OBJECT(machine) | "isa-bridge" | i82378 PCI-ISA bridge is a fixed onboard device; the machine owns it
dp264.c:129 | OBJECT(machine) | "sio" | SMC37C669 Super-I/O is a fixed onboard device
dp264.c:132 | OBJECT(machine) | "ide" | CMD646 IDE controller is a fixed onboard device
typhoon.c:833 | OBJECT(machine) | "typhoon" | Typhoon PCI host bridge is a fixed chipset of the DP264 board; thread an Object *parent argument through typhoon_init() from clipper_init()
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/alpha/alpha_sys.h | 3 ++-
hw/alpha/dp264.c | 12 +++++++-----
hw/alpha/typhoon.c | 6 +++---
3 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/hw/alpha/alpha_sys.h b/hw/alpha/alpha_sys.h
index 6e6691d116..f8aaf74933 100644
--- a/hw/alpha/alpha_sys.h
+++ b/hw/alpha/alpha_sys.h
@@ -9,7 +9,8 @@
#include "hw/intc/i8259.h"
-PCIBus *typhoon_init(MemoryRegion *, qemu_irq *, qemu_irq *, AlphaCPU *[4],
+PCIBus *typhoon_init(Object *parent, MemoryRegion *,
+ qemu_irq *, qemu_irq *, AlphaCPU *[4],
pci_map_irq_fn, uint8_t devfn_min);
/* alpha_pci.c. */
diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index 512b270838..9cd448cff1 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -49,6 +49,7 @@ static void clipper_init(MachineState *machine)
const char *kernel_cmdline = machine->kernel_cmdline;
const char *initrd_filename = machine->initrd_filename;
MachineClass *mc = MACHINE_GET_CLASS(machine);
+ Object *mo = OBJECT(machine);
AlphaCPU *cpus[4];
PCIBus *pci_bus;
PCIDevice *pci_dev;
@@ -65,7 +66,7 @@ static void clipper_init(MachineState *machine)
/* Create up to 4 cpus. */
memset(cpus, 0, sizeof(cpus));
for (i = 0; i < smp_cpus; ++i) {
- cpus[i] = ALPHA_CPU(cpu_create_orphan(machine->cpu_type));
+ cpus[i] = ALPHA_CPU(cpu_create(mo, "cpu[*]", machine->cpu_type));
}
/*
@@ -86,7 +87,7 @@ static void clipper_init(MachineState *machine)
* Init the chipset. Because we're using CLIPPER IRQ mappings,
* the minimum PCI device IdSel is 1.
*/
- pci_bus = typhoon_init(machine->ram, &isa_irq, &rtc_irq, cpus,
+ pci_bus = typhoon_init(mo, machine->ram, &isa_irq, &rtc_irq, cpus,
clipper_pci_map_irq, PCI_DEVFN(1, 0));
/*
@@ -110,7 +111,8 @@ static void clipper_init(MachineState *machine)
* Importantly, we need to provide a PCI device node for it, otherwise
* some operating systems won't notice there's an ISA bus to configure.
*/
- i82378_dev = DEVICE(pci_create_simple_orphan(pci_bus, PCI_DEVFN(7, 0), "i82378"));
+ i82378_dev = DEVICE(pci_create_simple(mo, "isa-bridge", pci_bus,
+ PCI_DEVFN(7, 0), "i82378"));
isa_bus = ISA_BUS(qdev_get_child_bus(i82378_dev, "isa.0"));
/* Connect the ISA PIC to the Typhoon IRQ used for ISA interrupts. */
@@ -126,10 +128,10 @@ static void clipper_init(MachineState *machine)
pci_init_nic_devices(pci_bus, mc->default_nic);
/* Super I/O */
- isa_create_simple_orphan(isa_bus, TYPE_SMC37C669_SUPERIO);
+ isa_create_simple(mo, "sio", isa_bus, TYPE_SMC37C669_SUPERIO);
/* IDE disk setup. */
- pci_dev = pci_create_simple_orphan(pci_bus, -1, "cmd646-ide");
+ pci_dev = pci_create_simple(mo, "ide", pci_bus, -1, "cmd646-ide");
pci_ide_create_devs(pci_dev);
/* Load PALcode. Given that this is not "real" cpu palcode,
diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
index af40647ccd..af39f2659b 100644
--- a/hw/alpha/typhoon.c
+++ b/hw/alpha/typhoon.c
@@ -819,7 +819,7 @@ static void typhoon_alarm_timer(void *opaque)
cpu_interrupt(CPU(s->cchip.cpu[cpu]), CPU_INTERRUPT_TIMER);
}
-PCIBus *typhoon_init(MemoryRegion *ram, qemu_irq *p_isa_irq,
+PCIBus *typhoon_init(Object *parent, MemoryRegion *ram, qemu_irq *p_isa_irq,
qemu_irq *p_rtc_irq, AlphaCPU *cpus[4],
pci_map_irq_fn sys_map_irq, uint8_t devfn_min)
{
@@ -830,7 +830,7 @@ PCIBus *typhoon_init(MemoryRegion *ram, qemu_irq *p_isa_irq,
PCIBus *b;
int i;
- dev = qdev_new_orphan(TYPE_TYPHOON_PCI_HOST_BRIDGE);
+ dev = qdev_new(parent, "typhoon", TYPE_TYPHOON_PCI_HOST_BRIDGE);
s = TYPHOON_PCI_HOST_BRIDGE(dev);
phb = PCI_HOST_BRIDGE(dev);
@@ -894,7 +894,7 @@ PCIBus *typhoon_init(MemoryRegion *ram, qemu_irq *p_isa_irq,
&s->pchip.reg_mem, &s->pchip.reg_io,
devfn_min, 64, TYPE_PCI_BUS);
phb->bus = b;
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
/* Host memory as seen from the PCI side, via the IOMMU. */
memory_region_init_iommu(&s->pchip.iommu, sizeof(s->pchip.iommu),
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 014/134] hw/nitro: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (12 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 013/134] hw/alpha: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-13 8:29 ` Philippe Mathieu-Daudé
2026-07-11 22:35 ` [RFC PATCH 015/134] hw/vmapple: " Alexander Graf
` (120 subsequent siblings)
134 siblings, 1 reply; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/nitro to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
file:line | parent | name | rationale
machine.c:200 | OBJECT(bridge) | "heartbeat" | onboard heartbeat is a fixed child of the vsock bridge it plugs into; bridge owns its lifetime
machine.c:212 | OBJECT(bridge) | "serial" | debug-mode serial-over-vsock is a fixed child of the same bridge
nitro-vsock-bus.c:51 | ORPHAN-JUSTIFIED| - | bridge is parented immediately after via qdev_set_id() to /machine/peripheral/nitro-vsock; keep the orphan creator here
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/nitro/machine.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/hw/nitro/machine.c b/hw/nitro/machine.c
index efcc2c8a3f..6b61de911f 100644
--- a/hw/nitro/machine.c
+++ b/hw/nitro/machine.c
@@ -195,10 +195,11 @@ static void nitro_machine_init(MachineState *machine)
if (defaults_enabled()) {
NitroVsockBridge *bridge = nitro_vsock_bridge_create();
+ DeviceState *dev;
/* Nitro Enclaves require a heartbeat device. Provide one. */
- qdev_realize(qdev_new_orphan(TYPE_NITRO_HEARTBEAT),
- BUS(&bridge->bus), &error_fatal);
+ dev = qdev_new(OBJECT(bridge), "heartbeat", TYPE_NITRO_HEARTBEAT);
+ qdev_realize(dev, BUS(&bridge->bus), &error_fatal);
/*
* In debug mode, Nitro Enclaves expose the guest's serial output via
@@ -209,8 +210,8 @@ static void nitro_machine_init(MachineState *machine)
Chardev *chr = serial_hd(0);
if (chr) {
- DeviceState *dev = qdev_new_orphan(TYPE_NITRO_SERIAL_VSOCK);
-
+ dev = qdev_new(OBJECT(bridge), "serial",
+ TYPE_NITRO_SERIAL_VSOCK);
qdev_prop_set_chr(dev, "chardev", chr);
qdev_realize(dev, BUS(&bridge->bus), &error_fatal);
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 014/134] hw/nitro: Give onboard devices a QOM parent
2026-07-11 22:35 ` [RFC PATCH 014/134] hw/nitro: " Alexander Graf
@ 2026-07-13 8:29 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 156+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-07-13 8:29 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
On 12/7/26 00:35, Alexander Graf wrote:
> Convert the *_orphan() device-creation calls in hw/nitro to the new
> parented API introduced earlier in this series, so every onboard
> device gets a stable path in the composition tree instead of landing
> in /machine/unattached with an unstable device[N] name.
>
> The parent for each device is the object that owns its lifetime: the
> machine for board-created devices, the containing device for
> composite children. Names follow existing QOM conventions.
>
> Per-site rationale (reviewers: dispute the modeling here):
>
> file:line | parent | name | rationale
> machine.c:200 | OBJECT(bridge) | "heartbeat" | onboard heartbeat is a fixed child of the vsock bridge it plugs into; bridge owns its lifetime
> machine.c:212 | OBJECT(bridge) | "serial" | debug-mode serial-over-vsock is a fixed child of the same bridge
> nitro-vsock-bus.c:51 | ORPHAN-JUSTIFIED| - | bridge is parented immediately after via qdev_set_id() to /machine/peripheral/nitro-vsock; keep the orphan creator here
>
> Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> hw/nitro/machine.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 015/134] hw/vmapple: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (13 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 014/134] hw/nitro: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 016/134] hw/hppa: " Alexander Graf
` (119 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/vmapple to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/vmapple/vmapple.c:158 | OBJECT(vms) | "bdif" | board-init helper receives VMAppleMachineState *vms; single instance
hw/vmapple/vmapple.c:172 | OBJECT(vms) | "pvpanic" | board-init helper receives vms; single instance
hw/vmapple/vmapple.c:187 | OBJECT(vms) | "cfg" | board-init helper receives vms; single instance
hw/vmapple/vmapple.c:212 | OBJECT(vms) | "gfx" | board-init helper receives vms; single instance
hw/vmapple/vmapple.c:225 | OBJECT(vms) | "aes" | board-init helper receives vms; single instance
hw/vmapple/vmapple.c:246 | OBJECT(vms) | "gic" | board-init helper receives vms; single instance
hw/vmapple/vmapple.c:293 | OBJECT(vms) | "uart" | board-init helper receives vms (const dropped); single instance
hw/vmapple/vmapple.c:308 | OBJECT(vms) | "rtc" | board-init helper receives vms (const dropped); single instance
hw/vmapple/vmapple.c:326 | OBJECT(vms) | "gpio" | board-init helper receives vms (const dropped); single instance
hw/vmapple/vmapple.c:334 | OBJECT(vms) | "gpio-key" | board-init helper receives vms; single instance
hw/vmapple/vmapple.c:387 | OBJECT(vms) | "pcie" | board-init helper receives vms; single GPEX host
hw/vmapple/vmapple.c:423 | OBJECT(vms) | "xhci" | board-init helper receives vms; single XHCI controller
hw/vmapple/vmapple.c:428 | OBJECT(usb_controller) | "usb-kbd" | lifetime owned by the XHCI controller it plugs into
hw/vmapple/vmapple.c:429 | OBJECT(usb_controller) | "usb-tablet" | lifetime owned by the XHCI controller it plugs into
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/vmapple/vmapple.c | 59 +++++++++++++++++++++++---------------------
1 file changed, 31 insertions(+), 28 deletions(-)
diff --git a/hw/vmapple/vmapple.c b/hw/vmapple/vmapple.c
index 4d218748c2..60c7dab89b 100644
--- a/hw/vmapple/vmapple.c
+++ b/hw/vmapple/vmapple.c
@@ -155,25 +155,25 @@ static void create_bdif(VMAppleMachineState *vms, MemoryRegion *mem)
}
/* PV backdoor device */
- bdif = qdev_new_orphan(TYPE_VMAPPLE_BDIF);
+ bdif = qdev_new(OBJECT(vms), "bdif", TYPE_VMAPPLE_BDIF);
bdif_sb = SYS_BUS_DEVICE(bdif);
sysbus_mmio_map(bdif_sb, 0, vms->memmap[VMAPPLE_BDOOR].base);
qdev_prop_set_drive(DEVICE(bdif), "aux", blk_by_legacy_dinfo(di_aux));
qdev_prop_set_drive(DEVICE(bdif), "root", blk_by_legacy_dinfo(di_root));
- sysbus_realize_and_unref(bdif_sb, &error_fatal);
+ sysbus_realize(bdif_sb, &error_fatal);
}
static void create_pvpanic(VMAppleMachineState *vms, MemoryRegion *mem)
{
SysBusDevice *pvpanic;
- vms->pvpanic = qdev_new_orphan(TYPE_PVPANIC_MMIO_DEVICE);
+ vms->pvpanic = qdev_new(OBJECT(vms), "pvpanic", TYPE_PVPANIC_MMIO_DEVICE);
pvpanic = SYS_BUS_DEVICE(vms->pvpanic);
sysbus_mmio_map(pvpanic, 0, vms->memmap[VMAPPLE_PVPANIC].base);
- sysbus_realize_and_unref(pvpanic, &error_fatal);
+ sysbus_realize(pvpanic, &error_fatal);
}
static bool create_cfg(VMAppleMachineState *vms, MemoryRegion *mem,
@@ -184,7 +184,7 @@ static bool create_cfg(VMAppleMachineState *vms, MemoryRegion *mem,
MachineState *machine = MACHINE(vms);
uint32_t rnd = 1;
- vms->cfg = qdev_new_orphan(TYPE_VMAPPLE_CFG);
+ vms->cfg = qdev_new(OBJECT(vms), "cfg", TYPE_VMAPPLE_CFG);
cfg = SYS_BUS_DEVICE(vms->cfg);
sysbus_mmio_map(cfg, 0, vms->memmap[VMAPPLE_CONFIG].base);
@@ -195,7 +195,7 @@ static bool create_cfg(VMAppleMachineState *vms, MemoryRegion *mem,
qdev_prop_set_uint64(vms->cfg, "ram-size", machine->ram_size);
qdev_prop_set_uint32(vms->cfg, "rnd", rnd);
- if (!sysbus_realize_and_unref(cfg, errp)) {
+ if (!sysbus_realize(cfg, errp)) {
error_prepend(errp, "Error creating vmapple cfg device: ");
return false;
}
@@ -209,12 +209,12 @@ static void create_gfx(VMAppleMachineState *vms, MemoryRegion *mem)
int irq_iosfc = vms->irqmap[VMAPPLE_APV_IOSFC];
SysBusDevice *gfx;
- gfx = SYS_BUS_DEVICE(qdev_new_orphan("apple-gfx-mmio"));
+ gfx = SYS_BUS_DEVICE(qdev_new(OBJECT(vms), "gfx", "apple-gfx-mmio"));
sysbus_mmio_map(gfx, 0, vms->memmap[VMAPPLE_APV_GFX].base);
sysbus_mmio_map(gfx, 1, vms->memmap[VMAPPLE_APV_IOSFC].base);
sysbus_connect_irq(gfx, 0, qdev_get_gpio_in(vms->gic, irq_gfx));
sysbus_connect_irq(gfx, 1, qdev_get_gpio_in(vms->gic, irq_iosfc));
- sysbus_realize_and_unref(gfx, &error_fatal);
+ sysbus_realize(gfx, &error_fatal);
}
static void create_aes(VMAppleMachineState *vms, MemoryRegion *mem)
@@ -222,11 +222,11 @@ static void create_aes(VMAppleMachineState *vms, MemoryRegion *mem)
int irq = vms->irqmap[VMAPPLE_AES_1];
SysBusDevice *aes;
- aes = SYS_BUS_DEVICE(qdev_new_orphan(TYPE_APPLE_AES));
+ aes = SYS_BUS_DEVICE(qdev_new(OBJECT(vms), "aes", TYPE_APPLE_AES));
sysbus_mmio_map(aes, 0, vms->memmap[VMAPPLE_AES_1].base);
sysbus_mmio_map(aes, 1, vms->memmap[VMAPPLE_AES_2].base);
sysbus_connect_irq(aes, 0, qdev_get_gpio_in(vms->gic, irq));
- sysbus_realize_and_unref(aes, &error_fatal);
+ sysbus_realize(aes, &error_fatal);
}
static int arm_gic_ppi_index(int cpu_nr, int ppi_index)
@@ -243,7 +243,7 @@ static void create_gic(VMAppleMachineState *vms, MemoryRegion *mem)
int i;
unsigned int smp_cpus = ms->smp.cpus;
- vms->gic = qdev_new_orphan(gicv3_class_name());
+ vms->gic = qdev_new(OBJECT(vms), "gic", gicv3_class_name());
qdev_prop_set_uint32(vms->gic, "revision", 3);
qdev_prop_set_uint32(vms->gic, "num-cpu", smp_cpus);
/*
@@ -261,7 +261,7 @@ static void create_gic(VMAppleMachineState *vms, MemoryRegion *mem)
qdev_prop_set_array(vms->gic, "redist-region-count", redist_region_count);
gicbusdev = SYS_BUS_DEVICE(vms->gic);
- sysbus_realize_and_unref(gicbusdev, &error_fatal);
+ sysbus_realize(gicbusdev, &error_fatal);
sysbus_mmio_map(gicbusdev, 0, vms->memmap[VMAPPLE_GIC_DIST].base);
sysbus_mmio_map(gicbusdev, 1, vms->memmap[VMAPPLE_GIC_REDIST].base);
@@ -285,27 +285,28 @@ static void create_gic(VMAppleMachineState *vms, MemoryRegion *mem)
}
}
-static void create_uart(const VMAppleMachineState *vms, int uart,
+static void create_uart(VMAppleMachineState *vms, int uart,
MemoryRegion *mem, Chardev *chr)
{
hwaddr base = vms->memmap[uart].base;
int irq = vms->irqmap[uart];
- DeviceState *dev = qdev_new_orphan(TYPE_PL011);
+ DeviceState *dev = qdev_new(OBJECT(vms), "uart", TYPE_PL011);
SysBusDevice *s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", chr);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
memory_region_add_subregion(mem, base,
sysbus_mmio_get_region(s, 0));
sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq));
}
-static void create_rtc(const VMAppleMachineState *vms)
+static void create_rtc(VMAppleMachineState *vms)
{
hwaddr base = vms->memmap[VMAPPLE_RTC].base;
int irq = vms->irqmap[VMAPPLE_RTC];
- sysbus_create_simple_orphan("pl031", base, qdev_get_gpio_in(vms->gic, irq));
+ sysbus_create_simple(OBJECT(vms), "rtc", "pl031", base,
+ qdev_get_gpio_in(vms->gic, irq));
}
static DeviceState *gpio_key_dev;
@@ -315,7 +316,7 @@ static void vmapple_powerdown_req(Notifier *n, void *opaque)
qemu_set_irq(qdev_get_gpio_in(gpio_key_dev, 0), 1);
}
-static void create_gpio_devices(const VMAppleMachineState *vms, int gpio,
+static void create_gpio_devices(VMAppleMachineState *vms, int gpio,
MemoryRegion *mem)
{
DeviceState *pl061_dev;
@@ -323,16 +324,16 @@ static void create_gpio_devices(const VMAppleMachineState *vms, int gpio,
int irq = vms->irqmap[gpio];
SysBusDevice *s;
- pl061_dev = qdev_new_orphan("pl061");
+ pl061_dev = qdev_new(OBJECT(vms), "gpio", "pl061");
/* Pull lines down to 0 if not driven by the PL061 */
qdev_prop_set_uint8(pl061_dev, "pullups", 0);
qdev_prop_set_uint8(pl061_dev, "pulldowns", 0xff);
s = SYS_BUS_DEVICE(pl061_dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
memory_region_add_subregion(mem, base, sysbus_mmio_get_region(s, 0));
sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq));
- gpio_key_dev = sysbus_create_simple_orphan("gpio-key", -1,
- qdev_get_gpio_in(pl061_dev, 3));
+ gpio_key_dev = sysbus_create_simple(OBJECT(vms), "gpio-key", "gpio-key",
+ -1, qdev_get_gpio_in(pl061_dev, 3));
}
static void vmapple_firmware_init(VMAppleMachineState *vms,
@@ -384,9 +385,9 @@ static void create_pcie(VMAppleMachineState *vms)
DeviceState *usb_controller;
USBBus *usb_bus;
- dev = qdev_new_orphan(TYPE_GPEX_HOST);
+ dev = qdev_new(OBJECT(vms), "pcie", TYPE_GPEX_HOST);
qdev_prop_set_uint32(dev, "num-irqs", GPEX_NUM_IRQS);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
/* Map only the first size_ecam bytes of ECAM space */
ecam_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
@@ -420,13 +421,15 @@ static void create_pcie(VMAppleMachineState *vms)
}
if (defaults_enabled()) {
- usb_controller = qdev_new_orphan(TYPE_QEMU_XHCI);
- qdev_realize_and_unref(usb_controller, BUS(pci->bus), &error_fatal);
+ usb_controller = qdev_new(OBJECT(vms), "xhci", TYPE_QEMU_XHCI);
+ qdev_realize(usb_controller, BUS(pci->bus), &error_fatal);
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_fatal));
- usb_create_simple_orphan(usb_bus, "usb-kbd");
- usb_create_simple_orphan(usb_bus, "usb-tablet");
+ usb_create_simple(OBJECT(usb_controller), "usb-kbd", usb_bus,
+ "usb-kbd");
+ usb_create_simple(OBJECT(usb_controller), "usb-tablet", usb_bus,
+ "usb-tablet");
}
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 016/134] hw/hppa: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (14 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 015/134] hw/vmapple: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 017/134] hw/microblaze: " Alexander Graf
` (118 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/hppa to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/hppa/machine.c:268 | OBJECT(machine) | "lasi" | lasi_init() static helper called from board init; thread Object *parent from caller
hw/hppa/machine.c:278 | OBJECT(machine) | "dino" | dino_init() static helper called from board init; thread Object *parent from caller
hw/hppa/machine.c:301 | OBJECT(machine) | "cpu[*]" | board init CPU creation loop; auto-index child of machine
hw/hppa/machine.c:414 | OBJECT(machine) | "artist" | board init tail; on-board Artist graphics owned by machine
hw/hppa/machine.c:431 | OBJECT(machine) | "diva-gsp" | board init tail; on-board Diva GSP PCI card owned by machine
hw/hppa/machine.c:446 | OBJECT(machine) | "ohci" | board init tail; on-board OHCI USB controller owned by machine
hw/hppa/machine.c:449 | OBJECT(pci_dev) | "usb-kbd" | USB keyboard is child of the OHCI controller it plugs into
hw/hppa/machine.c:450 | OBJECT(pci_dev) | "usb-mouse" | USB mouse is child of the OHCI controller it plugs into
hw/hppa/machine.c:617 | OBJECT(machine) | "lasips2" | HP 715 board init; on-board Lasi PS/2 controller
hw/hppa/machine.c:709 | OBJECT(machine) | "lasips2" | HP B160L board init; on-board Lasi PS/2 controller
hw/hppa/machine.c:724 | OBJECT(machine) | "scsi" | HP B160L board init; on-board LSI SCSI HBA
hw/hppa/machine.c:736 | OBJECT(machine) | "astro" | astro_init() static helper called from board init; thread Object *parent from caller
hw/hppa/machine.c:776 | OBJECT(machine) | "scsi" | HP C3700 board init; on-board LSI SCSI HBA
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/hppa/machine.c | 60 ++++++++++++++++++++++++++---------------------
1 file changed, 33 insertions(+), 27 deletions(-)
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index a4b8e9ee77..729524e065 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -261,24 +261,24 @@ static FWCfgState *create_fw_cfg(MachineState *ms, PCIBus *pci_bus,
return fw_cfg;
}
-static LasiState *lasi_init(void)
+static LasiState *lasi_init(Object *parent)
{
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_LASI_CHIP);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(parent, "lasi", TYPE_LASI_CHIP);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
return LASI_CHIP(dev);
}
-static DinoState *dino_init(MemoryRegion *addr_space)
+static DinoState *dino_init(Object *parent, MemoryRegion *addr_space)
{
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_DINO_PCI_HOST_BRIDGE);
+ dev = qdev_new(parent, "dino", TYPE_DINO_PCI_HOST_BRIDGE);
object_property_set_link(OBJECT(dev), "memory-as", OBJECT(addr_space),
&error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
return DINO_PCI_HOST_BRIDGE(dev);
}
@@ -298,7 +298,8 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine)
/* Create CPUs. */
for (unsigned int i = 0; i < smp_cpus; i++) {
- cpu[i] = HPPA_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu[i] = HPPA_CPU(cpu_create(OBJECT(machine), "cpu[*]",
+ machine->cpu_type));
}
/* Initialize memory */
@@ -411,11 +412,11 @@ static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
lasi_dev = hpm->lasi_dev;
if (lasi_dev && machine->enable_graphics &&
vga_interface_type != VGA_NONE) {
- dev = qdev_new_orphan("artist");
+ dev = qdev_new(OBJECT(machine), "artist", "artist");
s = SYS_BUS_DEVICE(dev);
bool disabled = object_property_get_bool(OBJECT(dev), "disable", NULL);
if (!disabled) {
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
vga_interface_created = true;
sysbus_mmio_map(s, 0, translate(NULL, LASI_GFX_HPA));
sysbus_mmio_map(s, 1, translate(NULL, ARTIST_FB_ADDR));
@@ -428,7 +429,8 @@ static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
if (pci_bus && hppa_is_pa20(&cpu[0]->env)) {
/* BMC board: HP Diva GSP PCI card */
- pci_dev = pci_new_multifunction_orphan(PCI_DEVFN(2, 0), "diva-gsp");
+ pci_dev = pci_new_multifunction(OBJECT(machine), "diva-gsp",
+ PCI_DEVFN(2, 0), "diva-gsp");
if (!lasi_dev) {
/* bind default keyboard/serial to Diva card */
qdev_prop_set_chr(DEVICE(pci_dev), "chardev1", serial_hd(0));
@@ -436,18 +438,19 @@ static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
qdev_prop_set_chr(DEVICE(pci_dev), "chardev3", serial_hd(2));
qdev_prop_set_chr(DEVICE(pci_dev), "chardev4", serial_hd(3));
}
- pci_realize_and_unref(pci_dev, pci_bus, &error_fatal);
+ qdev_realize(DEVICE(pci_dev), BUS(pci_bus), &error_fatal);
}
/* create USB OHCI controller for USB keyboard & mouse on Astro machines */
if (!lasi_dev && machine->enable_graphics && defaults_enabled()) {
USBBus *usb_bus;
- pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
+ pci_dev = pci_create_simple(OBJECT(machine), "ohci", pci_bus, -1,
+ "pci-ohci");
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
- usb_create_simple_orphan(usb_bus, "usb-kbd");
- usb_create_simple_orphan(usb_bus, "usb-mouse");
+ usb_create_simple(OBJECT(pci_dev), "usb-kbd", usb_bus, "usb-kbd");
+ usb_create_simple(OBJECT(pci_dev), "usb-mouse", usb_bus, "usb-mouse");
}
/* register power switch emulation */
@@ -597,7 +600,7 @@ static void machine_HP_715_init(MachineState *machine)
assert(isa_bus);
/* Init Lasi chip */
- lasi_dev = DEVICE(lasi_init());
+ lasi_dev = DEVICE(lasi_init(OBJECT(machine)));
hpm->lasi_dev = lasi_dev;
memory_region_add_subregion(addr_space, translate(NULL, LASI_HPA_715),
sysbus_mmio_get_region(
@@ -614,8 +617,8 @@ static void machine_HP_715_init(MachineState *machine)
parallel_hds[0]);
/* PS/2 Keyboard/Mouse */
- dev = qdev_new_orphan(TYPE_LASIPS2);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(machine), "lasips2", TYPE_LASIPS2);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
qdev_get_gpio_in(lasi_dev, LASI_IRQ_PS2KBD_HPA));
memory_region_add_subregion(addr_space,
@@ -672,14 +675,14 @@ static void machine_HP_B160L_init(MachineState *machine)
}
/* Init Lasi chip */
- lasi_dev = DEVICE(lasi_init());
+ lasi_dev = DEVICE(lasi_init(OBJECT(machine)));
hpm->lasi_dev = lasi_dev;
memory_region_add_subregion(addr_space, translate(NULL, LASI_HPA),
sysbus_mmio_get_region(
SYS_BUS_DEVICE(lasi_dev), 0));
/* Init Dino (PCI host bus chip). */
- dino_dev = DEVICE(dino_init(addr_space));
+ dino_dev = DEVICE(dino_init(OBJECT(machine), addr_space));
memory_region_add_subregion(addr_space, translate(NULL, DINO_HPA),
sysbus_mmio_get_region(
SYS_BUS_DEVICE(dino_dev), 0));
@@ -706,8 +709,8 @@ static void machine_HP_B160L_init(MachineState *machine)
parallel_hds[0]);
/* PS/2 Keyboard/Mouse */
- dev = qdev_new_orphan(TYPE_LASIPS2);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(machine), "lasips2", TYPE_LASIPS2);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
qdev_get_gpio_in(lasi_dev, LASI_IRQ_PS2KBD_HPA));
memory_region_add_subregion(addr_space,
@@ -721,7 +724,8 @@ static void machine_HP_B160L_init(MachineState *machine)
/* SCSI disk setup. */
if (drive_get_max_bus(IF_SCSI) >= 0) {
- dev = DEVICE(pci_create_simple_orphan(pci_bus, -1, "lsi53c895a"));
+ dev = DEVICE(pci_create_simple(OBJECT(machine), "scsi", pci_bus, -1,
+ "lsi53c895a"));
lsi53c8xx_handle_legacy_cmdline(dev);
}
@@ -729,15 +733,15 @@ static void machine_HP_B160L_init(MachineState *machine)
machine_HP_common_init_tail(machine, pci_bus, translate);
}
-static AstroState *astro_init(void)
+static AstroState *astro_init(Object *parent)
{
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_ASTRO_CHIP);
+ dev = qdev_new(parent, "astro", TYPE_ASTRO_CHIP);
object_property_set_int(OBJECT(dev), "phys-addr-bits",
hppa_phys_addr_bits(&cpu[0]->env),
&error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
return ASTRO_CHIP(dev);
}
@@ -763,7 +767,7 @@ static void machine_HP_C3700_init(MachineState *machine)
}
/* Init Astro and the Elroys (PCI host bus chips). */
- astro = astro_init();
+ astro = astro_init(OBJECT(machine));
astro_dev = DEVICE(astro);
memory_region_add_subregion(addr_space, translate(NULL, ASTRO_HPA),
sysbus_mmio_get_region(
@@ -773,7 +777,9 @@ static void machine_HP_C3700_init(MachineState *machine)
/* SCSI disk setup. */
if (drive_get_max_bus(IF_SCSI) >= 0) {
- DeviceState *dev = DEVICE(pci_create_simple_orphan(pci_bus, -1, "lsi53c895a"));
+ DeviceState *dev = DEVICE(pci_create_simple(OBJECT(machine), "scsi",
+ pci_bus, -1,
+ "lsi53c895a"));
lsi53c8xx_handle_legacy_cmdline(dev);
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 017/134] hw/microblaze: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (15 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 016/134] hw/hppa: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 018/134] hw/sh4: " Alexander Graf
` (117 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/microblaze to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/microblaze/petalogix_ml605_mmu.c:113 | OBJECT(machine) | "intc" | board init(); single XPS interrupt controller owned by machine
hw/microblaze/petalogix_ml605_mmu.c:129 | OBJECT(machine) | "timer" | board init(); single XPS timer block owned by machine
hw/microblaze/petalogix_ml605_mmu.c:138 | OBJECT(machine) | "xilinx-eth" | board init(); keep existing child name; drop now-redundant object_property_add_child()
hw/microblaze/petalogix_ml605_mmu.c:139 | OBJECT(machine) | "xilinx-dma" | board init(); keep existing child name; drop now-redundant object_property_add_child()
hw/microblaze/petalogix_ml605_mmu.c:177 | OBJECT(machine) | "spi" | board init(); single XPS SPI controller owned by machine
hw/microblaze/petalogix_ml605_mmu.c:191 | OBJECT(machine) | "spi-flash[*]" | board init(); NUM_SPI_FLASHES instances in loop, auto-index; plugged onto SPI bus but lifetime-owned by machine
hw/microblaze/petalogix_s3adsp1800_mmu.c:110 | OBJECT(machine) | "intc" | board init(); single XPS interrupt controller owned by machine
hw/microblaze/petalogix_s3adsp1800_mmu.c:122 | OBJECT(machine) | "uart" | board init(); single Xilinx uartlite owned by machine
hw/microblaze/petalogix_s3adsp1800_mmu.c:130 | OBJECT(machine) | "timer" | board init(); single XPS timer block owned by machine
hw/microblaze/petalogix_s3adsp1800_mmu.c:138 | OBJECT(machine) | "eth" | board init(); single XPS ethernetlite owned by machine
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/microblaze/petalogix_ml605_mmu.c | 28 ++++++++++--------------
hw/microblaze/petalogix_s3adsp1800_mmu.c | 16 +++++++-------
2 files changed, 20 insertions(+), 24 deletions(-)
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index 178cfd4a5e..031de37cec 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -110,10 +110,10 @@ petalogix_ml605_init(MachineState *machine)
64 * KiB, 2, 0x89, 0x18, 0x0000, 0x0, 0);
- dev = qdev_new_orphan("xlnx.xps-intc");
+ dev = qdev_new(OBJECT(machine), "intc", "xlnx.xps-intc");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_uint32(dev, "kind-of-intr", 1 << TIMER_IRQ);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, INTC_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
qdev_get_gpio_in(DEVICE(cpu), MB_CPU_IRQ));
@@ -126,21 +126,17 @@ petalogix_ml605_init(MachineState *machine)
DEVICE_LITTLE_ENDIAN);
/* 2 timers at irq 2 @ 100 Mhz. */
- dev = qdev_new_orphan("xlnx.xps-timer");
+ dev = qdev_new(OBJECT(machine), "timer", "xlnx.xps-timer");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_uint32(dev, "one-timer-only", 0);
qdev_prop_set_uint32(dev, "clock-frequency", 100 * 1000000);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, TIMER_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[TIMER_IRQ]);
/* axi ethernet and dma initialization. */
- eth0 = qdev_new_orphan("xlnx.axi-ethernet");
- dma = qdev_new_orphan("xlnx.axi-dma");
-
- /* FIXME: attach to the sysbus instead */
- object_property_add_child(qdev_get_machine(), "xilinx-eth", OBJECT(eth0));
- object_property_add_child(qdev_get_machine(), "xilinx-dma", OBJECT(dma));
+ eth0 = qdev_new(OBJECT(machine), "xilinx-eth", "xlnx.axi-ethernet");
+ dma = qdev_new(OBJECT(machine), "xilinx-dma", "xlnx.axi-dma");
ds = object_property_get_link(OBJECT(dma),
"axistream-connected-target", NULL);
@@ -153,7 +149,7 @@ petalogix_ml605_init(MachineState *machine)
&error_abort);
object_property_set_link(OBJECT(eth0), "axistream-control-connected", cs,
&error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(eth0), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(eth0), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(eth0), 0, AXIENET_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(eth0), 0, irq[AXIENET_IRQ]);
@@ -166,7 +162,7 @@ petalogix_ml605_init(MachineState *machine)
&error_abort);
object_property_set_link(OBJECT(dma), "axistream-control-connected", cs,
&error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dma), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dma), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dma), 0, AXIDMA_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dma), 0, irq[AXIDMA_IRQ0]);
sysbus_connect_irq(SYS_BUS_DEVICE(dma), 1, irq[AXIDMA_IRQ1]);
@@ -174,11 +170,11 @@ petalogix_ml605_init(MachineState *machine)
{
SSIBus *spi;
- dev = qdev_new_orphan("xlnx.xps-spi");
+ dev = qdev_new(OBJECT(machine), "spi", "xlnx.xps-spi");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_uint8(dev, "num-ss-bits", NUM_SPI_FLASHES);
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, SPI_BASEADDR);
sysbus_connect_irq(busdev, 0, irq[SPI_IRQ]);
@@ -188,14 +184,14 @@ petalogix_ml605_init(MachineState *machine)
dinfo = drive_get(IF_MTD, 0, i);
qemu_irq cs_line;
- dev = qdev_new_orphan("n25q128");
+ dev = qdev_new(OBJECT(machine), "spi-flash[*]", "n25q128");
if (dinfo) {
qdev_prop_set_drive_err(dev, "drive",
blk_by_legacy_dinfo(dinfo),
&error_fatal);
}
qdev_prop_set_uint8(dev, "cs", i);
- qdev_realize_and_unref(dev, BUS(spi), &error_fatal);
+ qdev_realize(dev, BUS(spi), &error_fatal);
cs_line = qdev_get_gpio_in_named(dev, SSI_GPIO_CS, 0);
sysbus_connect_irq(busdev, i+1, cs_line);
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index 91c1d64451..b4327ad493 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -107,11 +107,11 @@ petalogix_s3adsp1800_init(MachineState *machine)
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
64 * KiB, 1, 0x89, 0x18, 0x0000, 0x0, 1);
- dev = qdev_new_orphan("xlnx.xps-intc");
+ dev = qdev_new(OBJECT(machine), "intc", "xlnx.xps-intc");
qdev_prop_set_enum(dev, "endianness", endianness);
qdev_prop_set_uint32(dev, "kind-of-intr",
1 << ETHLITE_IRQ | 1 << UARTLITE_IRQ);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, INTC_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
qdev_get_gpio_in(DEVICE(cpu), MB_CPU_IRQ));
@@ -119,28 +119,28 @@ petalogix_s3adsp1800_init(MachineState *machine)
irq[i] = qdev_get_gpio_in(dev, i);
}
- dev = qdev_new_orphan(TYPE_XILINX_UARTLITE);
+ dev = qdev_new(OBJECT(machine), "uart", TYPE_XILINX_UARTLITE);
qdev_prop_set_enum(dev, "endianness", endianness);
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, UARTLITE_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[UARTLITE_IRQ]);
/* 2 timers at irq 2 @ 62 Mhz. */
- dev = qdev_new_orphan("xlnx.xps-timer");
+ dev = qdev_new(OBJECT(machine), "timer", "xlnx.xps-timer");
qdev_prop_set_enum(dev, "endianness", endianness);
qdev_prop_set_uint32(dev, "one-timer-only", 0);
qdev_prop_set_uint32(dev, "clock-frequency", 62 * 1000000);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, TIMER_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[TIMER_IRQ]);
- dev = qdev_new_orphan("xlnx.xps-ethernetlite");
+ dev = qdev_new(OBJECT(machine), "eth", "xlnx.xps-ethernetlite");
qdev_prop_set_enum(dev, "endianness", endianness);
qemu_configure_nic_device(dev, true, NULL);
qdev_prop_set_uint32(dev, "tx-ping-pong", 0);
qdev_prop_set_uint32(dev, "rx-ping-pong", 0);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, ETHLITE_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[ETHLITE_IRQ]);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 018/134] hw/sh4: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (16 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 017/134] hw/microblaze: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 019/134] hw/s390x: " Alexander Graf
` (116 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/sh4 to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/sh4/r2d.c:254 | cpu_create | OBJECT(machine) | "cpu" | board init: single CPU owned by machine
hw/sh4/r2d.c:269 | qdev_new | OBJECT(machine) | "pci-host" | board init: SH PCI host bridge owned by machine
hw/sh4/r2d.c:280 | qdev_new | OBJECT(machine) | "sm501" | board init: on-board SM501 companion chip owned by machine
hw/sh4/r2d.c:292 | qdev_new | OBJECT(machine) | "ide" | board init: on-board CF/IDE controller owned by machine
hw/sh4/r2d.c:323 | usb_create_simple | OBJECT(BUS(usb_bus)->parent) | "usb-kbd" | keyboard hangs off the SM501 OHCI controller that owns the USB bus
hw/sh4/sh7750.c:765 | qdev_new | parent | "sci" | SoC helper: threaded Object *parent from board; on-chip SCI UART
hw/sh4/sh7750.c:782 | qdev_new | parent | "scif" | SoC helper: threaded Object *parent from board; on-chip SCIF UART
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/sh4/r2d.c | 20 +++++++++++---------
hw/sh4/sh7750.c | 11 ++++++-----
include/hw/sh4/sh.h | 3 ++-
3 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index 9f313a77cb..c0f8cad335 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -251,7 +251,8 @@ static void r2d_init(MachineState *machine)
USBBus *usb_bus;
r2d_fpga_t *fpga;
- cpu = SUPERH_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = SUPERH_CPU(cpu_create(OBJECT(machine), "cpu",
+ machine->cpu_type));
env = &cpu->env;
reset_info = g_new0(ResetData, 1);
@@ -263,12 +264,12 @@ static void r2d_init(MachineState *machine)
memory_region_init_ram(sdram, NULL, "r2d.sdram", SDRAM_SIZE, &error_fatal);
memory_region_add_subregion(address_space_mem, SDRAM_BASE, sdram);
/* Register peripherals */
- s = sh7750_init(cpu, address_space_mem);
+ s = sh7750_init(OBJECT(machine), cpu, address_space_mem);
fpga = r2d_fpga_init(address_space_mem, 0x04000000, sh7750_irl(s));
- dev = qdev_new_orphan("sh_pci");
+ dev = qdev_new(OBJECT(machine), "pci-host", "sh_pci");
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci"));
sysbus_mmio_map(busdev, 0, P4ADDR(0x1e200000));
sysbus_mmio_map(busdev, 1, A7ADDR(0x1e200000));
@@ -277,23 +278,23 @@ static void r2d_init(MachineState *machine)
sysbus_connect_irq(busdev, 2, &fpga->irq[PCI_INTC]);
sysbus_connect_irq(busdev, 3, &fpga->irq[PCI_INTD]);
- dev = qdev_new_orphan("sysbus-sm501");
+ dev = qdev_new(OBJECT(machine), "sm501", "sysbus-sm501");
busdev = SYS_BUS_DEVICE(dev);
qdev_prop_set_uint32(dev, "vram-size", SM501_VRAM_SIZE);
qdev_prop_set_uint64(dev, "dma-offset", 0x10000000);
qdev_prop_set_chr(dev, "chardev", serial_hd(2));
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, 0x10000000);
sysbus_mmio_map(busdev, 1, 0x13e00000);
sysbus_connect_irq(busdev, 0, &fpga->irq[SM501]);
/* onboard CF (True IDE mode, Master only). */
dinfo = drive_get(IF_IDE, 0, 0);
- dev = qdev_new_orphan("mmio-ide");
+ dev = qdev_new(OBJECT(machine), "ide", "mmio-ide");
busdev = SYS_BUS_DEVICE(dev);
sysbus_connect_irq(busdev, 0, &fpga->irq[CF_IDE]);
qdev_prop_set_uint32(dev, "shift", 1);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, 0x14001000);
sysbus_mmio_map(busdev, 1, 0x1400080c);
mmio_ide_init_drives(dev, dinfo, NULL);
@@ -320,7 +321,8 @@ static void r2d_init(MachineState *machine)
/* USB keyboard */
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
- usb_create_simple_orphan(usb_bus, "usb-kbd");
+ usb_create_simple(OBJECT(BUS(usb_bus)->parent), "usb-kbd",
+ usb_bus, "usb-kbd");
/* Todo: register on board registers */
memset(&boot_params, 0, sizeof(boot_params));
diff --git a/hw/sh4/sh7750.c b/hw/sh4/sh7750.c
index 3eb47bc660..ff9724fadf 100644
--- a/hw/sh4/sh7750.c
+++ b/hw/sh4/sh7750.c
@@ -710,7 +710,8 @@ static const MemoryRegionOps sh7750_mmct_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
-SH7750State *sh7750_init(SuperHCPU *cpu, MemoryRegion *sysmem)
+SH7750State *sh7750_init(Object *parent, SuperHCPU *cpu,
+ MemoryRegion *sysmem)
{
SH7750State *s;
DeviceState *dev;
@@ -762,11 +763,11 @@ SH7750State *sh7750_init(SuperHCPU *cpu, MemoryRegion *sysmem)
cpu->env.intc_handle = &s->intc;
/* SCI */
- dev = qdev_new_orphan(TYPE_SH_SERIAL);
+ dev = qdev_new(parent, "sci", TYPE_SH_SERIAL);
dev->id = g_strdup("sci");
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
sb = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sb, &error_fatal);
+ sysbus_realize(sb, &error_fatal);
sysbus_mmio_map(sb, 0, 0xffe00000);
alias = g_malloc(sizeof(*alias));
mr = sysbus_mmio_get_region(sb, 0);
@@ -779,12 +780,12 @@ SH7750State *sh7750_init(SuperHCPU *cpu, MemoryRegion *sysmem)
qdev_connect_gpio_out_named(dev, "tei", 0, s->intc.irqs[SCI1_TEI]);
/* SCIF */
- dev = qdev_new_orphan(TYPE_SH_SERIAL);
+ dev = qdev_new(parent, "scif", TYPE_SH_SERIAL);
dev->id = g_strdup("scif");
qdev_prop_set_chr(dev, "chardev", serial_hd(1));
qdev_prop_set_uint8(dev, "features", SH_SERIAL_FEAT_SCIF);
sb = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sb, &error_fatal);
+ sysbus_realize(sb, &error_fatal);
sysbus_mmio_map(sb, 0, 0xffe80000);
alias = g_malloc(sizeof(*alias));
mr = sysbus_mmio_get_region(sb, 0);
diff --git a/include/hw/sh4/sh.h b/include/hw/sh4/sh.h
index c82feef8d0..b7ec234212 100644
--- a/include/hw/sh4/sh.h
+++ b/include/hw/sh4/sh.h
@@ -36,7 +36,8 @@
/* sh7750.c */
struct SH7750State;
-struct SH7750State *sh7750_init(SuperHCPU *cpu, MemoryRegion *sysmem);
+struct SH7750State *sh7750_init(Object *parent, SuperHCPU *cpu,
+ MemoryRegion *sysmem);
#define TYPE_SH_SERIAL "sh-serial"
#define SH_SERIAL_FEAT_SCIF (1 << 0)
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 019/134] hw/s390x: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (17 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 018/134] hw/sh4: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 020/134] hw/or1k: " Alexander Graf
` (115 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/s390x to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
file:line | parent | name | rationale
ap-bridge.c:52 | qdev_get_machine() | TYPE_AP_BRIDGE | already parented via object_property_add_child(); collapse into qdev_new() and keep the same name for QOM-path stability
css-bridge.c:95 | qdev_get_machine() | TYPE_VIRTUAL_CSS_BRIDGE | already parented via object_property_add_child(); collapse into qdev_new()
s390-pci-bus.c:970 | OBJECT(s) | "zpci[*]" | auto-created zPCI companion for a hot-plugged PCI device; the S390pciState host bridge owns it; auto-index name
s390-virtio-ccw.c:256 | OBJECT(ef) | type | already parented to the SCLP event facility; collapse into qdev_new() and keep the type-derived name
s390-virtio-ccw.c:268 | OBJECT(ef) | "sclpcpi" | already parented; collapse into qdev_new()
s390-virtio-ccw.c:312 | OBJECT(machine) | TYPE_S390_PCI_HOST_BRIDGE | already parented to machine; collapse into qdev_new() with the same name
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/s390x/ap-bridge.c | 6 ++----
hw/s390x/css-bridge.c | 7 +++----
hw/s390x/s390-pci-bus.c | 4 ++--
hw/s390x/s390-virtio-ccw.c | 17 +++++++----------
4 files changed, 14 insertions(+), 20 deletions(-)
diff --git a/hw/s390x/ap-bridge.c b/hw/s390x/ap-bridge.c
index ce9b09240a..d7b2c4bddc 100644
--- a/hw/s390x/ap-bridge.c
+++ b/hw/s390x/ap-bridge.c
@@ -49,10 +49,8 @@ void s390_init_ap(void)
}
/* Create bridge device */
- dev = qdev_new_orphan(TYPE_AP_BRIDGE);
- object_property_add_child(qdev_get_machine(), TYPE_AP_BRIDGE,
- OBJECT(dev));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(qdev_get_machine(), TYPE_AP_BRIDGE, TYPE_AP_BRIDGE);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
/* Create bus on bridge device */
bus = qbus_new(TYPE_AP_BUS, dev, TYPE_AP_BUS);
diff --git a/hw/s390x/css-bridge.c b/hw/s390x/css-bridge.c
index c6be24e5cb..8929d47b1b 100644
--- a/hw/s390x/css-bridge.c
+++ b/hw/s390x/css-bridge.c
@@ -92,9 +92,8 @@ VirtualCssBus *virtual_css_bus_init(void)
DeviceState *dev;
/* Create bridge device */
- dev = qdev_new_orphan(TYPE_VIRTUAL_CSS_BRIDGE);
- object_property_add_child(qdev_get_machine(), TYPE_VIRTUAL_CSS_BRIDGE,
- OBJECT(dev));
+ dev = qdev_new(qdev_get_machine(), TYPE_VIRTUAL_CSS_BRIDGE,
+ TYPE_VIRTUAL_CSS_BRIDGE);
/* Create bus on bridge device */
bus = qbus_new(TYPE_VIRTUAL_CSS_BUS, dev, "virtual-css");
@@ -102,7 +101,7 @@ VirtualCssBus *virtual_css_bus_init(void)
/* Enable hotplugging */
qbus_set_hotplug_handler(bus, OBJECT(dev));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
css_register_io_adapters(CSS_IO_ADAPTER_VIRTIO, true, false,
0, &error_abort);
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index bc335ca883..4f0a8a787b 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -967,7 +967,7 @@ static S390PCIBusDevice *s390_pci_device_new(S390pciState *s,
Error *local_err = NULL;
DeviceState *dev;
- dev = qdev_try_new_orphan(TYPE_S390_PCI_DEVICE);
+ dev = qdev_try_new(OBJECT(s), "zpci[*]", TYPE_S390_PCI_DEVICE);
if (!dev) {
error_setg(errp, "zPCI device could not be created");
return NULL;
@@ -979,7 +979,7 @@ static S390PCIBusDevice *s390_pci_device_new(S390pciState *s,
"zPCI device could not be created: ");
return NULL;
}
- if (!qdev_realize_and_unref(dev, BUS(s->bus), &local_err)) {
+ if (!qdev_realize(dev, BUS(s->bus), &local_err)) {
object_unparent(OBJECT(dev));
error_propagate_prepend(errp, local_err,
"zPCI device could not be created: ");
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index f9eb6cb411..1848cde0c4 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -253,10 +253,9 @@ static void s390_create_sclpconsole(SCLPDevice *sclp,
BusState *ev_fac_bus = sclp_get_event_facility_bus(ef);
DeviceState *dev;
- dev = qdev_new_orphan(type);
- object_property_add_child(OBJECT(ef), type, OBJECT(dev));
+ dev = qdev_new(OBJECT(ef), type, type);
qdev_prop_set_chr(dev, "chardev", chardev);
- qdev_realize_and_unref(dev, ev_fac_bus, &error_fatal);
+ qdev_realize(dev, ev_fac_bus, &error_fatal);
}
static void s390_create_sclpcpi(SCLPDevice *sclp)
@@ -265,9 +264,8 @@ static void s390_create_sclpcpi(SCLPDevice *sclp)
BusState *ev_fac_bus = sclp_get_event_facility_bus(ef);
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_SCLP_EVENT_CPI);
- object_property_add_child(OBJECT(ef), "sclpcpi", OBJECT(dev));
- qdev_realize_and_unref(dev, ev_fac_bus, &error_fatal);
+ dev = qdev_new(OBJECT(ef), "sclpcpi", TYPE_SCLP_EVENT_CPI);
+ qdev_realize(dev, ev_fac_bus, &error_fatal);
}
static void ccw_init(MachineState *machine)
@@ -309,10 +307,9 @@ static void ccw_init(MachineState *machine)
machine->firmware ?: "s390-ccw.img",
true);
- dev = qdev_new_orphan(TYPE_S390_PCI_HOST_BRIDGE);
- object_property_add_child(qdev_get_machine(), TYPE_S390_PCI_HOST_BRIDGE,
- OBJECT(dev));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(machine), TYPE_S390_PCI_HOST_BRIDGE,
+ TYPE_S390_PCI_HOST_BRIDGE);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
s390_enable_css_support(s390_cpu_addr2state(0));
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 020/134] hw/or1k: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (18 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 019/134] hw/s390x: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 021/134] hw/loongarch: " Alexander Graf
` (114 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/or1k to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/or1k/or1k-sim.c:189 | OBJECT(state) | "irq-splitter[*]" | board-init helper receives Or1ksimState; auto-index (net + serial share the pool)
hw/or1k/or1k-sim.c:224 | OBJECT(state) | "ompic" | board-init helper receives Or1ksimState; single OMPIC per machine
hw/or1k/or1k-sim.c:257 | OBJECT(state) | "irq-splitter[*]" | board-init helper receives Or1ksimState; auto-index alongside net splitter
hw/or1k/or1k-sim.c:302 | OBJECT(machine) | "cpu[*]" | MachineClass.init(); auto-index over smp_cpus
hw/or1k/virt.c:113 | parent | "irq-splitter[*]" | static helper had no parent-capable arg; add Object *parent first arg, thread OBJECT(state) from all callers; auto-index (serial+rtc+virtio*N)
hw/or1k/virt.c:209 | OBJECT(state) | "ompic" | board-init helper receives OR1KVirtState; single OMPIC
hw/or1k/virt.c:303 | OBJECT(state) | "rtc" | board-init helper receives OR1KVirtState; single Goldfish RTC
hw/or1k/virt.c:382 | OBJECT(state) | "pcie" | board-init helper receives OR1KVirtState; single GPEX host
hw/or1k/virt.c:454 | OBJECT(state) | "virtio-mmio[*]" | board-init helper receives OR1KVirtState; called VIRTIO_COUNT times, auto-index
hw/or1k/virt.c:484 | OBJECT(machine) | "cpu[*]" | MachineClass.init(); auto-index over smp_cpus
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/or1k/or1k-sim.c | 17 ++++++++++-------
hw/or1k/virt.c | 37 ++++++++++++++++++++++---------------
2 files changed, 32 insertions(+), 22 deletions(-)
diff --git a/hw/or1k/or1k-sim.c b/hw/or1k/or1k-sim.c
index 6962313315..da05d7cbe3 100644
--- a/hw/or1k/or1k-sim.c
+++ b/hw/or1k/or1k-sim.c
@@ -186,9 +186,10 @@ static void openrisc_sim_net_init(Or1ksimState *state, hwaddr base, hwaddr size,
s = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(s, &error_fatal);
if (num_cpus > 1) {
- DeviceState *splitter = qdev_new_orphan(TYPE_SPLIT_IRQ);
+ DeviceState *splitter = qdev_new(OBJECT(state), "irq-splitter[*]",
+ TYPE_SPLIT_IRQ);
qdev_prop_set_uint32(splitter, "num-lines", num_cpus);
- qdev_realize_and_unref(splitter, NULL, &error_fatal);
+ qdev_realize(splitter, NULL, &error_fatal);
for (i = 0; i < num_cpus; i++) {
qdev_connect_gpio_out(splitter, i, get_cpu_irq(cpus, i, irq_pin));
}
@@ -221,11 +222,11 @@ static void openrisc_sim_ompic_init(Or1ksimState *state, hwaddr base,
char *nodename;
int i;
- dev = qdev_new_orphan("or1k-ompic");
+ dev = qdev_new(OBJECT(state), "ompic", "or1k-ompic");
qdev_prop_set_uint32(dev, "num-cpus", num_cpus);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
for (i = 0; i < num_cpus; i++) {
sysbus_connect_irq(s, i, get_cpu_irq(cpus, i, irq_pin));
}
@@ -254,9 +255,10 @@ static void openrisc_sim_serial_init(Or1ksimState *state, hwaddr base,
int i;
if (num_cpus > 1) {
- DeviceState *splitter = qdev_new_orphan(TYPE_SPLIT_IRQ);
+ DeviceState *splitter = qdev_new(OBJECT(state), "irq-splitter[*]",
+ TYPE_SPLIT_IRQ);
qdev_prop_set_uint32(splitter, "num-lines", num_cpus);
- qdev_realize_and_unref(splitter, NULL, &error_fatal);
+ qdev_realize(splitter, NULL, &error_fatal);
for (i = 0; i < num_cpus; i++) {
qdev_connect_gpio_out(splitter, i, get_cpu_irq(cpus, i, irq_pin));
}
@@ -299,7 +301,8 @@ static void openrisc_sim_init(MachineState *machine)
assert(smp_cpus >= 1 && smp_cpus <= OR1KSIM_CPUS_MAX);
for (n = 0; n < smp_cpus; n++) {
- cpus[n] = OPENRISC_CPU(cpu_create_orphan(machine->cpu_type));
+ cpus[n] = OPENRISC_CPU(cpu_create(OBJECT(machine), "cpu[*]",
+ machine->cpu_type));
if (cpus[n] == NULL) {
fprintf(stderr, "Unable to find CPU definition!\n");
exit(1);
diff --git a/hw/or1k/virt.c b/hw/or1k/virt.c
index f222efafde..7362433a02 100644
--- a/hw/or1k/virt.c
+++ b/hw/or1k/virt.c
@@ -105,14 +105,16 @@ static qemu_irq get_cpu_irq(OpenRISCCPU *cpus[], int cpunum, int irq_pin)
return qdev_get_gpio_in_named(DEVICE(cpus[cpunum]), "IRQ", irq_pin);
}
-static qemu_irq get_per_cpu_irq(OpenRISCCPU *cpus[], int num_cpus, int irq_pin)
+static qemu_irq get_per_cpu_irq(Object *parent, OpenRISCCPU *cpus[],
+ int num_cpus, int irq_pin)
{
int i;
if (num_cpus > 1) {
- DeviceState *splitter = qdev_new_orphan(TYPE_SPLIT_IRQ);
+ DeviceState *splitter = qdev_new(parent, "irq-splitter[*]",
+ TYPE_SPLIT_IRQ);
qdev_prop_set_uint32(splitter, "num-lines", num_cpus);
- qdev_realize_and_unref(splitter, NULL, &error_fatal);
+ qdev_realize(splitter, NULL, &error_fatal);
for (i = 0; i < num_cpus; i++) {
qdev_connect_gpio_out(splitter, i, get_cpu_irq(cpus, i, irq_pin));
}
@@ -206,11 +208,11 @@ static void openrisc_virt_ompic_init(OR1KVirtState *state, hwaddr base,
char *nodename;
int i;
- dev = qdev_new_orphan("or1k-ompic");
+ dev = qdev_new(OBJECT(state), "ompic", "or1k-ompic");
qdev_prop_set_uint32(dev, "num-cpus", num_cpus);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
for (i = 0; i < num_cpus; i++) {
sysbus_connect_irq(s, i, get_cpu_irq(cpus, i, irq_pin));
}
@@ -233,7 +235,8 @@ static void openrisc_virt_serial_init(OR1KVirtState *state, hwaddr base,
{
void *fdt = state->fdt;
char *nodename;
- qemu_irq serial_irq = get_per_cpu_irq(cpus, num_cpus, irq_pin);
+ qemu_irq serial_irq = get_per_cpu_irq(OBJECT(state), cpus, num_cpus,
+ irq_pin);
serial_mm_init(get_system_memory(), base, 0, serial_irq, 115200,
serial_hd(0), DEVICE_BIG_ENDIAN);
@@ -297,10 +300,12 @@ static void openrisc_virt_rtc_init(OR1KVirtState *state, hwaddr base,
{
void *fdt = state->fdt;
char *nodename;
- qemu_irq rtc_irq = get_per_cpu_irq(cpus, num_cpus, irq_pin);
+ qemu_irq rtc_irq = get_per_cpu_irq(OBJECT(state), cpus, num_cpus,
+ irq_pin);
/* Goldfish RTC */
- sysbus_create_simple_orphan(TYPE_GOLDFISH_RTC, base, rtc_irq);
+ sysbus_create_simple(OBJECT(state), "rtc", TYPE_GOLDFISH_RTC, base,
+ rtc_irq);
/* Goldfish RTC FDT */
nodename = g_strdup_printf("/soc/rtc@%" HWADDR_PRIx, base);
@@ -379,8 +384,8 @@ static void openrisc_virt_pcie_init(OR1KVirtState *state,
qemu_irq pcie_irq;
int i;
- dev = qdev_new_orphan(TYPE_GPEX_HOST);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(state), "pcie", TYPE_GPEX_HOST);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
/* Map ECAM space. */
alias = g_new0(MemoryRegion, 1);
@@ -410,7 +415,7 @@ static void openrisc_virt_pcie_init(OR1KVirtState *state,
/* Connect IRQ lines. */
for (i = 0; i < PCI_NUM_PINS; i++) {
- pcie_irq = get_per_cpu_irq(cpus, num_cpus, irq_base + i);
+ pcie_irq = get_per_cpu_irq(OBJECT(state), cpus, num_cpus, irq_base + i);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, pcie_irq);
gpex_set_irq_num(GPEX_HOST(dev), i, irq_base + i);
@@ -448,13 +453,14 @@ static void openrisc_virt_virtio_init(OR1KVirtState *state, hwaddr base,
char *nodename;
DeviceState *dev;
SysBusDevice *sysbus;
- qemu_irq virtio_irq = get_per_cpu_irq(cpus, num_cpus, irq_pin);
+ qemu_irq virtio_irq = get_per_cpu_irq(OBJECT(state), cpus, num_cpus,
+ irq_pin);
/* VirtIO MMIO devices */
- dev = qdev_new_orphan(TYPE_VIRTIO_MMIO);
+ dev = qdev_new(OBJECT(state), "virtio-mmio[*]", TYPE_VIRTIO_MMIO);
qdev_prop_set_bit(dev, "force-legacy", false);
sysbus = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
sysbus_connect_irq(sysbus, 0, virtio_irq);
sysbus_mmio_map(sysbus, 0, base);
@@ -481,7 +487,8 @@ static void openrisc_virt_init(MachineState *machine)
assert(smp_cpus >= 1 && smp_cpus <= VIRT_CPUS_MAX);
for (n = 0; n < smp_cpus; n++) {
- cpus[n] = OPENRISC_CPU(cpu_create_orphan(machine->cpu_type));
+ cpus[n] = OPENRISC_CPU(cpu_create(OBJECT(machine), "cpu[*]",
+ machine->cpu_type));
if (cpus[n] == NULL) {
fprintf(stderr, "Unable to find CPU definition!\n");
exit(1);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 021/134] hw/loongarch: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (19 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 020/134] hw/or1k: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 022/134] hw/intc: " Alexander Graf
` (113 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/loongarch to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
file:line | creator | parent | name | rationale
hw/loongarch/virt.c:153 | qdev_new | OBJECT(lvms) | name | board-init helper already receives lvms + child name; drop redundant object_property_add_child()
hw/loongarch/virt.c:298 | qdev_new | OBJECT(lvms) | "acpi-ged" | board-init helper receives LoongArchVirtMachineState *lvms
hw/loongarch/virt.c:325 | qdev_new | parent | "platform-bus" | static helper w/o parent ptr; add Object *parent first arg, thread OBJECT(lvms) from caller
hw/loongarch/virt.c:403 | qdev_new | OBJECT(lvms) | "pci-host" | board-init helper receives lvms
hw/loongarch/virt.c:488 | sysbus_create_simple | OBJECT(lvms) | "rtc" | board-init helper receives lvms
hw/loongarch/virt.c:604 | qdev_new | OBJECT(lvms) | "ipi" | virt_irq_init() receives lvms
hw/loongarch/virt.c:610 | qdev_new | OBJECT(lvms) | "dintc" | virt_irq_init() receives lvms
hw/loongarch/virt.c:617 | qdev_new | OBJECT(lvms) | "extioi" | virt_irq_init() receives lvms
hw/loongarch/virt.c:625 | qdev_new | OBJECT(lvms) | "pch-pic" | virt_irq_init() receives lvms
hw/loongarch/virt.c:631 | qdev_new | OBJECT(lvms) | "pch-msi" | virt_irq_init() receives lvms
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/loongarch/virt.c | 43 +++++++++++++++++++++----------------------
1 file changed, 21 insertions(+), 22 deletions(-)
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 45acdc3ec1..6ba693874f 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -150,7 +150,7 @@ static PFlashCFI01 *virt_flash_create1(LoongArchVirtMachineState *lvms,
const char *name,
const char *alias_prop_name)
{
- DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new(OBJECT(lvms), name, TYPE_PFLASH_CFI01);
qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE);
qdev_prop_set_uint8(dev, "width", 4);
@@ -161,7 +161,6 @@ static PFlashCFI01 *virt_flash_create1(LoongArchVirtMachineState *lvms,
qdev_prop_set_uint16(dev, "id2", 0x00);
qdev_prop_set_uint16(dev, "id3", 0x00);
qdev_prop_set_string(dev, "name", name);
- object_property_add_child(OBJECT(lvms), name, OBJECT(dev));
object_property_add_alias(OBJECT(lvms), alias_prop_name,
OBJECT(dev), "drive");
return PFLASH_CFI01(dev);
@@ -191,7 +190,7 @@ static void virt_flash_map1(PFlashCFI01 *flash,
assert(real_size / VIRT_FLASH_SECTOR_SIZE <= UINT32_MAX);
qdev_prop_set_uint32(dev, "num-blocks", real_size / VIRT_FLASH_SECTOR_SIZE);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
memory_region_add_subregion(sysmem, base,
sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0));
}
@@ -295,9 +294,9 @@ static DeviceState *create_acpi_ged(DeviceState *pch_pic,
event |= ACPI_GED_CPU_HOTPLUG_EVT;
}
- dev = qdev_new_orphan(TYPE_ACPI_GED);
+ dev = qdev_new(OBJECT(lvms), "acpi-ged", TYPE_ACPI_GED);
qdev_prop_set_uint32(dev, "ged-event", event);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
/* ged event */
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, VIRT_GED_EVT_ADDR);
@@ -315,18 +314,18 @@ static DeviceState *create_acpi_ged(DeviceState *pch_pic,
return dev;
}
-static DeviceState *create_platform_bus(DeviceState *pch_pic)
+static DeviceState *create_platform_bus(Object *parent, DeviceState *pch_pic)
{
DeviceState *dev;
SysBusDevice *sysbus;
int i, irq;
MemoryRegion *sysmem = get_system_memory();
- dev = qdev_new_orphan(TYPE_PLATFORM_BUS_DEVICE);
+ dev = qdev_new(parent, "platform-bus", TYPE_PLATFORM_BUS_DEVICE);
dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE);
qdev_prop_set_uint32(dev, "num_irqs", VIRT_PLATFORM_BUS_NUM_IRQS);
qdev_prop_set_uint32(dev, "mmio_size", VIRT_PLATFORM_BUS_SIZE);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus = SYS_BUS_DEVICE(dev);
for (i = 0; i < VIRT_PLATFORM_BUS_NUM_IRQS; i++) {
@@ -400,9 +399,9 @@ static void virt_devices_init(DeviceState *pch_pic,
hwaddr mmio_base, mmio_size;
int i, irq;
- gpex_dev = qdev_new_orphan(TYPE_GPEX_HOST);
+ gpex_dev = qdev_new(OBJECT(lvms), "pci-host", TYPE_GPEX_HOST);
d = SYS_BUS_DEVICE(gpex_dev);
- sysbus_realize_and_unref(d, &error_fatal);
+ sysbus_realize(d, &error_fatal);
pci_bus = PCI_HOST_BRIDGE(gpex_dev)->bus;
lvms->gpex.pio.base = VIRT_PCI_IO_BASE;
lvms->gpex.pio.size = VIRT_PCI_IO_SIZE;
@@ -485,14 +484,14 @@ static void virt_devices_init(DeviceState *pch_pic,
* Create some unimplemented devices to emulate this.
*/
create_unimplemented_device("pci-dma-cfg", 0x1001041c, 0x4);
- sysbus_create_simple_orphan("ls7a_rtc", VIRT_RTC_REG_BASE,
+ sysbus_create_simple(OBJECT(lvms), "rtc", "ls7a_rtc", VIRT_RTC_REG_BASE,
qdev_get_gpio_in(pch_pic,
VIRT_RTC_IRQ - VIRT_GSI_BASE));
/* acpi ged */
lvms->acpi_ged = create_acpi_ged(pch_pic, lvms);
/* platform bus */
- lvms->platform_bus_dev = create_platform_bus(pch_pic);
+ lvms->platform_bus_dev = create_platform_bus(OBJECT(lvms), pch_pic);
}
static void virt_cpu_irq_init(LoongArchVirtMachineState *lvms)
@@ -601,40 +600,40 @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
*/
/* Create IPI device */
- ipi = qdev_new_orphan(TYPE_LOONGARCH_IPI);
+ ipi = qdev_new(OBJECT(lvms), "ipi", TYPE_LOONGARCH_IPI);
lvms->ipi = ipi;
- sysbus_realize_and_unref(SYS_BUS_DEVICE(ipi), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(ipi), &error_fatal);
/* Create DINTC device*/
if (virt_has_dmsi(lvms)) {
- dintc = qdev_new_orphan(TYPE_LOONGARCH_DINTC);
+ dintc = qdev_new(OBJECT(lvms), "dintc", TYPE_LOONGARCH_DINTC);
lvms->dintc = dintc;
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dintc), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dintc), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dintc), 0, VIRT_DINTC_BASE);
}
/* Create EXTIOI device */
- extioi = qdev_new_orphan(TYPE_LOONGARCH_EXTIOI);
+ extioi = qdev_new(OBJECT(lvms), "extioi", TYPE_LOONGARCH_EXTIOI);
lvms->extioi = extioi;
if (virt_is_veiointc_enabled(lvms)) {
qdev_prop_set_bit(extioi, "has-virtualization-extension", true);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(extioi), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(extioi), &error_fatal);
virt_cpu_irq_init(lvms);
- pch_pic = qdev_new_orphan(TYPE_LOONGARCH_PIC);
+ pch_pic = qdev_new(OBJECT(lvms), "pch-pic", TYPE_LOONGARCH_PIC);
num = VIRT_PCH_PIC_IRQ_NUM;
qdev_prop_set_uint32(pch_pic, "pch_pic_irq_num", num);
d = SYS_BUS_DEVICE(pch_pic);
- sysbus_realize_and_unref(d, &error_fatal);
+ sysbus_realize(d, &error_fatal);
- pch_msi = qdev_new_orphan(TYPE_LOONGARCH_PCH_MSI);
+ pch_msi = qdev_new(OBJECT(lvms), "pch-msi", TYPE_LOONGARCH_PCH_MSI);
start = num;
num = EXTIOI_IRQS - start;
qdev_prop_set_uint32(pch_msi, "msi_irq_base", start);
qdev_prop_set_uint32(pch_msi, "msi_irq_num", num);
d = SYS_BUS_DEVICE(pch_msi);
- sysbus_realize_and_unref(d, &error_fatal);
+ sysbus_realize(d, &error_fatal);
sysbus_mmio_map(d, 0, VIRT_PCH_MSI_ADDR_LOW);
if (kvm_irqchip_in_kernel()) {
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 022/134] hw/intc: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (20 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 021/134] hw/loongarch: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 023/134] hw/pci-host: " Alexander Graf
` (112 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/intc to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/intc/apic_common.c:285 | sysbus_create_simple | qdev_get_machine() | "kvmvapic" | function-static singleton shared by all per-CPU APICs; cannot belong to any single APIC, so parent to the machine
hw/intc/exynos4210_gic.c:63 | qdev_new | OBJECT(dev) | "gic" | inside exynos4210_gic_realize(); inner GIC is a component of the composite Exynos GIC device
hw/intc/i8259_common.c:97 | isa_new | Object *parent (new arg) | "i8259[*]" | i8259_init_chip() is a helper with no parent-capable arg; thread Object *parent through i8259_init()/kvm_i8259_init() and their callers; two chips per parent so auto-index
hw/intc/riscv_aclint.c:372 | qdev_new | Object *parent (new arg) | "aclint-mtimer[*]" | riscv_aclint_mtimer_create() helper; parent threaded from board/SoC callers; per-socket instances so auto-index
hw/intc/riscv_aclint.c:555 | qdev_new | Object *parent (new arg) | "aclint-swi[*]" | riscv_aclint_swi_create() helper; parent threaded from board/SoC callers; per-socket M/S-SWI so auto-index
hw/intc/riscv_aplic.c:1116 | qdev_new | Object *parent (new arg) | "aplic[*]" | riscv_aplic_create() helper; existing DeviceState *parent (APLIC hierarchy) renamed to aplic_parent to avoid clash; multiple M/S instances so auto-index
hw/intc/riscv_imsic.c:477 | qdev_new | Object *parent (new arg) | "imsic[*]" | riscv_imsic_create() helper; parent threaded from board/SoC callers; per-hart M/S instances so auto-index
hw/intc/s390_flic.c:65 | qdev_new | qdev_get_machine() | TYPE_KVM_S390_FLIC | already followed by object_property_add_child(machine, ...); collapse into parented qdev_new() and drop the redundant add_child
hw/intc/s390_flic.c:69 | qdev_new | qdev_get_machine() | TYPE_QEMU_S390_FLIC | same as above; collapse into parented qdev_new() and drop the redundant add_child
hw/intc/sifive_plic.c:484 | qdev_new | Object *parent (new arg) | "plic[*]" | sifive_plic_create() helper; parent threaded from board/SoC callers; per-socket instances so auto-index
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/hppa/machine.c | 8 ++++----
hw/i386/isapc.c | 2 +-
hw/i386/kvm/i8259.c | 6 +++---
hw/i386/microvm.c | 2 +-
hw/i386/pc.c | 6 +++---
hw/i386/pc_piix.c | 2 +-
hw/i386/pc_q35.c | 2 +-
hw/intc/apic_common.c | 3 ++-
hw/intc/exynos4210_gic.c | 4 ++--
hw/intc/i8259.c | 6 +++---
hw/intc/i8259_common.c | 7 ++++---
hw/intc/riscv_aclint.c | 16 ++++++++++------
hw/intc/riscv_aplic.c | 13 +++++++------
hw/intc/riscv_imsic.c | 7 ++++---
hw/intc/s390_flic.c | 12 +++++-------
hw/intc/sifive_plic.c | 7 ++++---
hw/isa/i82378.c | 2 +-
hw/isa/piix.c | 2 +-
hw/isa/vt82c686.c | 2 +-
hw/mips/jazz.c | 2 +-
hw/riscv/aia.c | 12 +++++++-----
hw/riscv/aia.h | 3 ++-
hw/riscv/cps.c | 9 +++++----
hw/riscv/k230.c | 12 +++++++-----
hw/riscv/microchip_pfsoc.c | 7 ++++---
hw/riscv/shakti_c.c | 8 +++++---
hw/riscv/sifive_e.c | 7 ++++---
hw/riscv/sifive_u.c | 7 ++++---
hw/riscv/spike.c | 4 ++--
hw/riscv/tt_atlantis.c | 6 ++++--
hw/riscv/virt.c | 27 +++++++++++++++++----------
hw/riscv/xiangshan_kmh.c | 18 ++++++++++--------
include/hw/i386/pc.h | 2 +-
include/hw/intc/i8259.h | 4 ++--
include/hw/intc/riscv_aclint.h | 6 ++++--
include/hw/intc/riscv_aplic.h | 5 +++--
include/hw/intc/riscv_imsic.h | 3 ++-
include/hw/intc/sifive_plic.h | 3 ++-
include/hw/isa/i8259_internal.h | 3 ++-
39 files changed, 146 insertions(+), 111 deletions(-)
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 729524e065..e50f9adf41 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -97,7 +97,7 @@ static const MemoryRegionOps hppa_pci_ignore_ops = {
},
};
-static ISABus *hppa_isa_bus(hwaddr addr)
+static ISABus *hppa_isa_bus(Object *parent, hwaddr addr)
{
ISABus *isa_bus;
qemu_irq *isa_irqs;
@@ -110,7 +110,7 @@ static ISABus *hppa_isa_bus(hwaddr addr)
isa_bus = isa_bus_new(NULL, get_system_memory(), isa_region,
&error_abort);
- isa_irqs = i8259_init(isa_bus, NULL);
+ isa_irqs = i8259_init(parent, isa_bus, NULL);
isa_bus_register_input_irqs(isa_bus, isa_irqs);
return isa_bus;
@@ -596,7 +596,7 @@ static void machine_HP_715_init(MachineState *machine)
}
/* Create ISA bus, needed for PS/2 kbd/mouse port emulation */
- isa_bus = hppa_isa_bus(translate(NULL, IDE_HPA));
+ isa_bus = hppa_isa_bus(OBJECT(machine), translate(NULL, IDE_HPA));
assert(isa_bus);
/* Init Lasi chip */
@@ -690,7 +690,7 @@ static void machine_HP_B160L_init(MachineState *machine)
assert(pci_bus);
/* Create ISA bus, needed for PS/2 kbd/mouse port emulation */
- isa_bus = hppa_isa_bus(translate(NULL, IDE_HPA));
+ isa_bus = hppa_isa_bus(OBJECT(machine), translate(NULL, IDE_HPA));
assert(isa_bus);
/* Serial ports: Lasi and Dino use a 7.272727 MHz clock. */
diff --git a/hw/i386/isapc.c b/hw/i386/isapc.c
index 03d68f748f..655ec599b5 100644
--- a/hw/i386/isapc.c
+++ b/hw/i386/isapc.c
@@ -123,7 +123,7 @@ static void pc_init_isa(MachineState *machine)
pcms->hpet_enabled = false;
if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
- pc_i8259_create(isa_bus, gsi_state->i8259_irq);
+ pc_i8259_create(OBJECT(machine), isa_bus, gsi_state->i8259_irq);
}
if (tcg_enabled()) {
diff --git a/hw/i386/kvm/i8259.c b/hw/i386/kvm/i8259.c
index 66f37e1303..5fb11d3613 100644
--- a/hw/i386/kvm/i8259.c
+++ b/hw/i386/kvm/i8259.c
@@ -131,10 +131,10 @@ static void kvm_pic_realize(DeviceState *dev, Error **errp)
kpc->parent_realize(dev, errp);
}
-qemu_irq *kvm_i8259_init(ISABus *bus)
+qemu_irq *kvm_i8259_init(Object *parent, ISABus *bus)
{
- i8259_init_chip(TYPE_KVM_I8259, bus, true);
- i8259_init_chip(TYPE_KVM_I8259, bus, false);
+ i8259_init_chip(parent, TYPE_KVM_I8259, bus, true);
+ i8259_init_chip(parent, TYPE_KVM_I8259, bus, false);
return qemu_allocate_irqs(kvm_pic_set_irq, NULL, ISA_NUM_IRQS);
}
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 22688687c4..16bd885541 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -251,7 +251,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
qemu_irq *i8259;
- i8259 = i8259_init(isa_bus, x86_allocate_cpu_irq());
+ i8259 = i8259_init(OBJECT(mms), isa_bus, x86_allocate_cpu_irq());
for (i = 0; i < ISA_NUM_IRQS; i++) {
gsi_state->i8259_irq[i] = i8259[i];
}
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 905b4960a3..24ba1189d7 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1159,16 +1159,16 @@ void pc_nic_init(PCMachineClass *pcmc, ISABus *isa_bus, PCIBus *pci_bus)
}
}
-void pc_i8259_create(ISABus *isa_bus, qemu_irq *i8259_irqs)
+void pc_i8259_create(Object *parent, ISABus *isa_bus, qemu_irq *i8259_irqs)
{
qemu_irq *i8259;
if (kvm_pic_in_kernel()) {
- i8259 = kvm_i8259_init(isa_bus);
+ i8259 = kvm_i8259_init(parent, isa_bus);
} else if (xen_enabled()) {
i8259 = xen_interrupt_controller_init();
} else {
- i8259 = i8259_init(isa_bus, x86_allocate_cpu_irq());
+ i8259 = i8259_init(parent, isa_bus, x86_allocate_cpu_irq());
}
for (size_t i = 0; i < ISA_NUM_IRQS; i++) {
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index bd4c129143..3f361c8396 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -281,7 +281,7 @@ static void pc_init1(MachineState *machine, const char *pci_type)
if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
- pc_i8259_create(isa_bus, gsi_state->i8259_irq);
+ pc_i8259_create(OBJECT(machine), isa_bus, gsi_state->i8259_irq);
}
ioapic_init_gsi(gsi_state, phb);
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index daa75dbc26..a4a7169398 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -272,7 +272,7 @@ static void pc_q35_init(MachineState *machine)
isa_bus = ISA_BUS(qdev_get_child_bus(lpc_dev, "isa.0"));
if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
- pc_i8259_create(isa_bus, gsi_state->i8259_irq);
+ pc_i8259_create(OBJECT(machine), isa_bus, gsi_state->i8259_irq);
}
ioapic_init_gsi(gsi_state, OBJECT(phb));
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index aaa7dca480..be90fe0d2b 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -282,7 +282,8 @@ static void apic_common_realize(DeviceState *dev, Error **errp)
/* Note: We need at least 1M to map the VAPIC option ROM */
if (!vapic && s->vapic_control & VAPIC_ENABLE_MASK &&
current_machine->ram_size >= 1024 * 1024) {
- vapic = sysbus_create_simple_orphan("kvmvapic", -1, NULL);
+ vapic = sysbus_create_simple(qdev_get_machine(), "kvmvapic",
+ "kvmvapic", -1, NULL);
}
s->vapic = vapic;
if (apic_report_tpr_access && info->enable_tpr_reporting) {
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
index dd29a86035..d6e987c8c6 100644
--- a/hw/intc/exynos4210_gic.c
+++ b/hw/intc/exynos4210_gic.c
@@ -60,11 +60,11 @@ static void exynos4210_gic_realize(DeviceState *dev, Error **errp)
uint32_t n = s->num_cpu;
uint32_t i;
- s->gic = qdev_new_orphan("arm_gic");
+ s->gic = qdev_new(obj, "gic", "arm_gic");
qdev_prop_set_uint32(s->gic, "num-cpu", s->num_cpu);
qdev_prop_set_uint32(s->gic, "num-irq", EXYNOS4210_GIC_NIRQ);
gicbusdev = SYS_BUS_DEVICE(s->gic);
- sysbus_realize_and_unref(gicbusdev, &error_fatal);
+ sysbus_realize(gicbusdev, &error_fatal);
/* Pass through outbound IRQ lines from the GIC */
sysbus_pass_irq(sbd, gicbusdev);
diff --git a/hw/intc/i8259.c b/hw/intc/i8259.c
index 8f2aa1f0fb..1446d5197a 100644
--- a/hw/intc/i8259.c
+++ b/hw/intc/i8259.c
@@ -401,7 +401,7 @@ static void pic_realize(DeviceState *dev, Error **errp)
pc->parent_realize(dev, errp);
}
-qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq_in)
+qemu_irq *i8259_init(Object *parent, ISABus *bus, qemu_irq parent_irq_in)
{
qemu_irq *irq_set;
DeviceState *dev;
@@ -410,7 +410,7 @@ qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq_in)
irq_set = g_new0(qemu_irq, ISA_NUM_IRQS);
- isadev = i8259_init_chip(TYPE_I8259, bus, true);
+ isadev = i8259_init_chip(parent, TYPE_I8259, bus, true);
dev = DEVICE(isadev);
qdev_connect_gpio_out(dev, 0, parent_irq_in);
@@ -420,7 +420,7 @@ qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq_in)
isa_pic = PIC_COMMON(dev);
- isadev = i8259_init_chip(TYPE_I8259, bus, false);
+ isadev = i8259_init_chip(parent, TYPE_I8259, bus, false);
dev = DEVICE(isadev);
qdev_connect_gpio_out(dev, 0, irq_set[2]);
diff --git a/hw/intc/i8259_common.c b/hw/intc/i8259_common.c
index 45eb0e14a8..7d3137fe19 100644
--- a/hw/intc/i8259_common.c
+++ b/hw/intc/i8259_common.c
@@ -89,18 +89,19 @@ static void pic_common_realize(DeviceState *dev, Error **errp)
qdev_set_legacy_instance_id(dev, s->iobase, 1);
}
-ISADevice *i8259_init_chip(const char *name, ISABus *bus, bool master)
+ISADevice *i8259_init_chip(Object *parent, const char *name, ISABus *bus,
+ bool master)
{
DeviceState *dev;
ISADevice *isadev;
- isadev = isa_new_orphan(name);
+ isadev = isa_new(parent, "i8259[*]", name);
dev = DEVICE(isadev);
qdev_prop_set_uint32(dev, "iobase", master ? 0x20 : 0xa0);
qdev_prop_set_uint32(dev, "elcr_addr", master ? 0x4d0 : 0x4d1);
qdev_prop_set_uint8(dev, "elcr_mask", master ? 0xf8 : 0xde);
qdev_prop_set_bit(dev, "master", master);
- isa_realize_and_unref(isadev, bus, &error_fatal);
+ qdev_realize(dev, BUS(bus), &error_fatal);
return isadev;
}
diff --git a/hw/intc/riscv_aclint.c b/hw/intc/riscv_aclint.c
index 92030d94b6..8a0e5d6d1c 100644
--- a/hw/intc/riscv_aclint.c
+++ b/hw/intc/riscv_aclint.c
@@ -363,13 +363,15 @@ static const TypeInfo riscv_aclint_mtimer_info = {
/*
* Create ACLINT MTIMER device.
*/
-DeviceState *riscv_aclint_mtimer_create(hwaddr addr, hwaddr size,
+DeviceState *riscv_aclint_mtimer_create(Object *parent,
+ hwaddr addr, hwaddr size,
uint32_t hartid_base, uint32_t num_harts,
uint32_t timecmp_base, uint32_t time_base, uint32_t timebase_freq,
bool provide_rdtime)
{
int i;
- DeviceState *dev = qdev_new_orphan(TYPE_RISCV_ACLINT_MTIMER);
+ DeviceState *dev = qdev_new(parent, "aclint-mtimer[*]",
+ TYPE_RISCV_ACLINT_MTIMER);
RISCVAclintMTimerState *s = RISCV_ACLINT_MTIMER(dev);
assert(num_harts <= RISCV_ACLINT_MAX_HARTS);
@@ -383,7 +385,7 @@ DeviceState *riscv_aclint_mtimer_create(hwaddr addr, hwaddr size,
qdev_prop_set_uint32(dev, "time-base", time_base);
qdev_prop_set_uint32(dev, "aperture-size", size);
qdev_prop_set_uint32(dev, "timebase-freq", timebase_freq);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
for (i = 0; i < num_harts; i++) {
@@ -548,11 +550,13 @@ static const TypeInfo riscv_aclint_swi_info = {
/*
* Create ACLINT [M|S]SWI device.
*/
-DeviceState *riscv_aclint_swi_create(hwaddr addr, uint32_t hartid_base,
+DeviceState *riscv_aclint_swi_create(Object *parent, hwaddr addr,
+ uint32_t hartid_base,
uint32_t num_harts, bool sswi)
{
int i;
- DeviceState *dev = qdev_new_orphan(TYPE_RISCV_ACLINT_SWI);
+ DeviceState *dev = qdev_new(parent, "aclint-swi[*]",
+ TYPE_RISCV_ACLINT_SWI);
assert(num_harts <= RISCV_ACLINT_MAX_HARTS);
assert(!(addr & 0x3));
@@ -560,7 +564,7 @@ DeviceState *riscv_aclint_swi_create(hwaddr addr, uint32_t hartid_base,
qdev_prop_set_uint32(dev, "hartid-base", hartid_base);
qdev_prop_set_uint32(dev, "num-harts", num_harts);
qdev_prop_set_uint32(dev, "sswi", sswi ? true : false);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
for (i = 0; i < num_harts; i++) {
diff --git a/hw/intc/riscv_aplic.c b/hw/intc/riscv_aplic.c
index 977e259cb9..491faaa2cf 100644
--- a/hw/intc/riscv_aplic.c
+++ b/hw/intc/riscv_aplic.c
@@ -1109,11 +1109,12 @@ void riscv_aplic_add_child(DeviceState *parent, DeviceState *child)
/*
* Create APLIC device.
*/
-DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size,
+DeviceState *riscv_aplic_create(Object *parent, hwaddr addr, hwaddr size,
uint32_t hartid_base, uint32_t num_harts, uint32_t num_sources,
- uint32_t iprio_bits, bool msimode, bool mmode, DeviceState *parent)
+ uint32_t iprio_bits, bool msimode, bool mmode,
+ DeviceState *aplic_parent)
{
- DeviceState *dev = qdev_new_orphan(TYPE_RISCV_APLIC);
+ DeviceState *dev = qdev_new(parent, "aplic[*]", TYPE_RISCV_APLIC);
uint32_t i;
assert(num_harts < APLIC_MAX_IDC);
@@ -1130,11 +1131,11 @@ DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size,
qdev_prop_set_bit(dev, "msimode", msimode);
qdev_prop_set_bit(dev, "mmode", mmode);
- if (parent) {
- riscv_aplic_add_child(parent, dev);
+ if (aplic_parent) {
+ riscv_aplic_add_child(aplic_parent, dev);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
if (riscv_use_emulated_aplic(msimode)) {
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
diff --git a/hw/intc/riscv_imsic.c b/hw/intc/riscv_imsic.c
index f05917ad5e..1587be5e8b 100644
--- a/hw/intc/riscv_imsic.c
+++ b/hw/intc/riscv_imsic.c
@@ -471,10 +471,11 @@ type_init(riscv_imsic_register_types)
/*
* Create IMSIC device.
*/
-DeviceState *riscv_imsic_create(hwaddr addr, uint32_t hartid, bool mmode,
+DeviceState *riscv_imsic_create(Object *parent, hwaddr addr,
+ uint32_t hartid, bool mmode,
uint32_t num_pages, uint32_t num_ids)
{
- DeviceState *dev = qdev_new_orphan(TYPE_RISCV_IMSIC);
+ DeviceState *dev = qdev_new(parent, "imsic[*]", TYPE_RISCV_IMSIC);
CPUState *cpu = cpu_by_arch_id(hartid);
uint32_t i;
@@ -493,7 +494,7 @@ DeviceState *riscv_imsic_create(hwaddr addr, uint32_t hartid, bool mmode,
qdev_prop_set_uint32(dev, "num-pages", num_pages);
qdev_prop_set_uint32(dev, "num-irqs", num_ids + 1);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
if (!kvm_irqchip_in_kernel()) {
diff --git a/hw/intc/s390_flic.c b/hw/intc/s390_flic.c
index c86c0e1e60..8d165d6b9e 100644
--- a/hw/intc/s390_flic.c
+++ b/hw/intc/s390_flic.c
@@ -62,15 +62,13 @@ void s390_flic_init(void)
DeviceState *dev;
if (kvm_enabled()) {
- dev = qdev_new_orphan(TYPE_KVM_S390_FLIC);
- object_property_add_child(qdev_get_machine(), TYPE_KVM_S390_FLIC,
- OBJECT(dev));
+ dev = qdev_new(qdev_get_machine(), TYPE_KVM_S390_FLIC,
+ TYPE_KVM_S390_FLIC);
} else {
- dev = qdev_new_orphan(TYPE_QEMU_S390_FLIC);
- object_property_add_child(qdev_get_machine(), TYPE_QEMU_S390_FLIC,
- OBJECT(dev));
+ dev = qdev_new(qdev_get_machine(), TYPE_QEMU_S390_FLIC,
+ TYPE_QEMU_S390_FLIC);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
}
static int qemu_s390_register_io_adapter(S390FLICState *fs, uint32_t id,
diff --git a/hw/intc/sifive_plic.c b/hw/intc/sifive_plic.c
index 00e6258403..f2262ed5ae 100644
--- a/hw/intc/sifive_plic.c
+++ b/hw/intc/sifive_plic.c
@@ -473,7 +473,8 @@ type_init(sifive_plic_register_types)
/*
* Create PLIC device.
*/
-DeviceState *sifive_plic_create(hwaddr addr, char *hart_config,
+DeviceState *sifive_plic_create(Object *parent, hwaddr addr,
+ char *hart_config,
uint32_t num_harts,
uint32_t hartid_base, uint32_t num_sources,
uint32_t num_priorities, uint32_t priority_base,
@@ -481,7 +482,7 @@ DeviceState *sifive_plic_create(hwaddr addr, char *hart_config,
uint32_t enable_stride, uint32_t context_base,
uint32_t context_stride, uint32_t aperture_size)
{
- DeviceState *dev = qdev_new_orphan(TYPE_SIFIVE_PLIC);
+ DeviceState *dev = qdev_new(parent, "plic[*]", TYPE_SIFIVE_PLIC);
int i;
SiFivePLICState *plic;
@@ -498,7 +499,7 @@ DeviceState *sifive_plic_create(hwaddr addr, char *hart_config,
qdev_prop_set_uint32(dev, "context-base", context_base);
qdev_prop_set_uint32(dev, "context-stride", context_stride);
qdev_prop_set_uint32(dev, "aperture-size", aperture_size);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
plic = SIFIVE_PLIC(dev);
diff --git a/hw/isa/i82378.c b/hw/isa/i82378.c
index 63d4050db2..da09d869f5 100644
--- a/hw/isa/i82378.c
+++ b/hw/isa/i82378.c
@@ -94,7 +94,7 @@ static void i82378_realize(PCIDevice *pci, Error **errp)
*/
/* 2 82C59 (irq) */
- s->isa_irqs_in = i8259_init(isabus,
+ s->isa_irqs_in = i8259_init(OBJECT(pci), isabus,
qemu_allocate_irq(i82378_request_out0_irq,
s, 0));
isa_bus_register_input_irqs(isabus, s->isa_irqs_in);
diff --git a/hw/isa/piix.c b/hw/isa/piix.c
index 31fa53e6a4..6b2946d82c 100644
--- a/hw/isa/piix.c
+++ b/hw/isa/piix.c
@@ -319,7 +319,7 @@ static void pci_piix_realize(PCIDevice *dev, const char *uhci_type,
qemu_init_irq_child(OBJECT(dev), "i8259-irq", &d->i8259_irq,
piix_request_i8259_irq, d, 0);
- i8259 = i8259_init(isa_bus, &d->i8259_irq);
+ i8259 = i8259_init(OBJECT(dev), isa_bus, &d->i8259_irq);
for (size_t i = 0; i < ISA_NUM_IRQS; i++) {
d->isa_irqs_in[i] = i8259[i];
diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c
index 99be41d0ad..de9006bd95 100644
--- a/hw/isa/vt82c686.c
+++ b/hw/isa/vt82c686.c
@@ -730,7 +730,7 @@ static void via_isa_realize(PCIDevice *d, Error **errp)
return;
}
- s->isa_irqs_in = i8259_init(isa_bus, &s->i8259_irq);
+ s->isa_irqs_in = i8259_init(OBJECT(d), isa_bus, &s->i8259_irq);
isa_bus_register_input_irqs(isa_bus, s->isa_irqs_in);
i8254_pit_init(isa_bus, 0x40, 0, NULL);
i8257_dma_init(OBJECT(d), isa_bus, 0);
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index 849c97eb10..5e34a6582d 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -285,7 +285,7 @@ static void mips_jazz_init(MachineState *machine,
isa_bus = isa_bus_new(NULL, isa_mem, isa_io, &error_abort);
/* ISA devices */
- i8259 = i8259_init(isa_bus, env->irq[4]);
+ i8259 = i8259_init(OBJECT(machine), isa_bus, env->irq[4]);
isa_bus_register_input_irqs(isa_bus, i8259);
i8257_dma_init(OBJECT(rc4030), isa_bus, 0);
pit = i8254_pit_init(isa_bus, 0x40, 0, NULL);
diff --git a/hw/riscv/aia.c b/hw/riscv/aia.c
index ed89160029..3ffdfe86fd 100644
--- a/hw/riscv/aia.c
+++ b/hw/riscv/aia.c
@@ -24,7 +24,8 @@ uint32_t imsic_num_bits(uint32_t count)
return ret;
}
-DeviceState *riscv_create_aia(bool msimode, int aia_guests,
+DeviceState *riscv_create_aia(Object *parent,
+ bool msimode, int aia_guests,
uint32_t m_imsic_stride,
uint16_t num_sources,
const MemMapEntry *aplic_m,
@@ -48,7 +49,7 @@ DeviceState *riscv_create_aia(bool msimode, int aia_guests,
/* Per-socket M-level IMSICs */
addr = imsic_m->base + socket * (1U << IMSIC_MMIO_GROUP_MIN_SHIFT);
for (i = 0; i < hart_count; i++) {
- riscv_imsic_create(addr + i * m_imsic_stride,
+ riscv_imsic_create(parent, addr + i * m_imsic_stride,
base_hartid + i, true, 1,
num_msis);
}
@@ -58,7 +59,8 @@ DeviceState *riscv_create_aia(bool msimode, int aia_guests,
guest_bits = imsic_num_bits(aia_guests + 1);
addr = imsic_s->base + socket * (1U << IMSIC_MMIO_GROUP_MIN_SHIFT);
for (i = 0; i < hart_count; i++) {
- riscv_imsic_create(addr + i * IMSIC_HART_SIZE(guest_bits),
+ riscv_imsic_create(parent,
+ addr + i * IMSIC_HART_SIZE(guest_bits),
base_hartid + i, false, 1 + aia_guests,
num_msis);
}
@@ -66,7 +68,7 @@ DeviceState *riscv_create_aia(bool msimode, int aia_guests,
if (!kvm_enabled()) {
/* Per-socket M-level APLIC */
- aplic_m_dev = riscv_aplic_create(aplic_m->base +
+ aplic_m_dev = riscv_aplic_create(parent, aplic_m->base +
socket * aplic_m->size,
aplic_m->size,
(msimode) ? 0 : base_hartid,
@@ -77,7 +79,7 @@ DeviceState *riscv_create_aia(bool msimode, int aia_guests,
}
/* Per-socket S-level APLIC */
- aplic_s_dev = riscv_aplic_create(aplic_s->base +
+ aplic_s_dev = riscv_aplic_create(parent, aplic_s->base +
socket * aplic_s->size,
aplic_s->size,
(msimode) ? 0 : base_hartid,
diff --git a/hw/riscv/aia.h b/hw/riscv/aia.h
index 565f91accc..09bae100e3 100644
--- a/hw/riscv/aia.h
+++ b/hw/riscv/aia.h
@@ -13,7 +13,8 @@
uint32_t imsic_num_bits(uint32_t count);
-DeviceState *riscv_create_aia(bool msimode, int aia_guests,
+DeviceState *riscv_create_aia(Object *parent,
+ bool msimode, int aia_guests,
uint32_t m_imsic_stride,
uint16_t num_sources,
const MemMapEntry *aplic_m,
diff --git a/hw/riscv/cps.c b/hw/riscv/cps.c
index 86172be5b3..b6b30e05e1 100644
--- a/hw/riscv/cps.c
+++ b/hw/riscv/cps.c
@@ -135,14 +135,15 @@ static void riscv_cps_realize(DeviceState *dev, Error **errp)
for (i = 0; i < num_of_clusters; i++) {
uint64_t cm_base = GLOBAL_CM_BASE + (CM_SIZE * i);
uint32_t hartid_base = i << MHARTID_CLUSTER_SHIFT;
- s->aplic = riscv_aplic_create(cm_base + AIA_PLIC_M_OFFSET,
+ s->aplic = riscv_aplic_create(OBJECT(dev),
+ cm_base + AIA_PLIC_M_OFFSET,
AIA_PLIC_M_SIZE,
hartid_base, /* hartid_base */
MAX_HARTS, /* num_harts */
APLIC_NUM_SOURCES,
APLIC_NUM_PRIO_BITS,
false, true, NULL);
- riscv_aplic_create(cm_base + AIA_PLIC_S_OFFSET,
+ riscv_aplic_create(OBJECT(dev), cm_base + AIA_PLIC_S_OFFSET,
AIA_PLIC_S_SIZE,
hartid_base, /* hartid_base */
MAX_HARTS, /* num_harts */
@@ -151,9 +152,9 @@ static void riscv_cps_realize(DeviceState *dev, Error **errp)
false, false, s->aplic);
/* PLIC changes msi_nonbroken to ture. We revert the change. */
msi_nonbroken = false;
- riscv_aclint_swi_create(cm_base + AIA_CLINT_OFFSET,
+ riscv_aclint_swi_create(OBJECT(dev), cm_base + AIA_CLINT_OFFSET,
hartid_base, MAX_HARTS, false);
- riscv_aclint_mtimer_create(cm_base + AIA_CLINT_OFFSET +
+ riscv_aclint_mtimer_create(OBJECT(dev), cm_base + AIA_CLINT_OFFSET +
RISCV_ACLINT_SWI_SIZE,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE,
hartid_base,
diff --git a/hw/riscv/k230.c b/hw/riscv/k230.c
index 656f28190c..9c67dfb895 100644
--- a/hw/riscv/k230.c
+++ b/hw/riscv/k230.c
@@ -117,7 +117,8 @@ static void k230_soc_init(Object *obj)
memmap[K230_DEV_BOOTROM].base);
}
-static DeviceState *k230_create_plic(int base_hartid, int hartid_count)
+static DeviceState *k230_create_plic(Object *parent, int base_hartid,
+ int hartid_count)
{
g_autofree char *plic_hart_config = NULL;
@@ -125,7 +126,7 @@ static DeviceState *k230_create_plic(int base_hartid, int hartid_count)
plic_hart_config = riscv_plic_hart_config_string(hartid_count);
/* Per-socket PLIC */
- return sifive_plic_create(memmap[K230_DEV_PLIC].base,
+ return sifive_plic_create(parent, memmap[K230_DEV_PLIC].base,
plic_hart_config, hartid_count, base_hartid,
K230_PLIC_NUM_SOURCES,
K230_PLIC_NUM_PRIORITIES,
@@ -174,12 +175,13 @@ static void k230_soc_realize(DeviceState *dev, Error **errp)
&s->bootrom);
/* PLIC */
- s->c908_plic = k230_create_plic(C908_CPU_HARTID, c908_cpus);
+ s->c908_plic = k230_create_plic(OBJECT(dev), C908_CPU_HARTID, c908_cpus);
/* CLINT */
- riscv_aclint_swi_create(memmap[K230_DEV_CLINT].base,
+ riscv_aclint_swi_create(OBJECT(dev), memmap[K230_DEV_CLINT].base,
C908_CPU_HARTID, c908_cpus, false);
- riscv_aclint_mtimer_create(memmap[K230_DEV_CLINT].base + 0x4000,
+ riscv_aclint_mtimer_create(OBJECT(dev),
+ memmap[K230_DEV_CLINT].base + 0x4000,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE,
C908_CPU_HARTID, c908_cpus,
RISCV_ACLINT_DEFAULT_MTIMECMP,
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index cc93b5c2ba..18ce57fba4 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -250,9 +250,9 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
memmap[MICROCHIP_PFSOC_BUSERR_UNIT4].size);
/* CLINT */
- riscv_aclint_swi_create(memmap[MICROCHIP_PFSOC_CLINT].base,
+ riscv_aclint_swi_create(OBJECT(dev), memmap[MICROCHIP_PFSOC_CLINT].base,
0, ms->smp.cpus, false);
- riscv_aclint_mtimer_create(
+ riscv_aclint_mtimer_create(OBJECT(dev),
memmap[MICROCHIP_PFSOC_CLINT].base + RISCV_ACLINT_SWI_SIZE,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
@@ -281,7 +281,8 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
plic_hart_config = riscv_plic_hart_config_string(ms->smp.cpus);
/* PLIC */
- s->plic = sifive_plic_create(memmap[MICROCHIP_PFSOC_PLIC].base,
+ s->plic = sifive_plic_create(OBJECT(dev),
+ memmap[MICROCHIP_PFSOC_PLIC].base,
plic_hart_config, ms->smp.cpus, 0,
MICROCHIP_PFSOC_PLIC_NUM_SOURCES,
MICROCHIP_PFSOC_PLIC_NUM_PRIORITIES,
diff --git a/hw/riscv/shakti_c.c b/hw/riscv/shakti_c.c
index 835b1f879b..a6f832dd31 100644
--- a/hw/riscv/shakti_c.c
+++ b/hw/riscv/shakti_c.c
@@ -115,7 +115,8 @@ static void shakti_c_soc_state_realize(DeviceState *dev, Error **errp)
sysbus_realize(SYS_BUS_DEVICE(&sss->cpus), &error_abort);
- sss->plic = sifive_plic_create(shakti_c_memmap[SHAKTI_C_PLIC].base,
+ sss->plic = sifive_plic_create(OBJECT(dev),
+ shakti_c_memmap[SHAKTI_C_PLIC].base,
(char *)SHAKTI_C_PLIC_HART_CONFIG, ms->smp.cpus, 0,
SHAKTI_C_PLIC_NUM_SOURCES,
SHAKTI_C_PLIC_NUM_PRIORITIES,
@@ -127,9 +128,10 @@ static void shakti_c_soc_state_realize(DeviceState *dev, Error **errp)
SHAKTI_C_PLIC_CONTEXT_STRIDE,
shakti_c_memmap[SHAKTI_C_PLIC].size);
- riscv_aclint_swi_create(shakti_c_memmap[SHAKTI_C_CLINT].base,
+ riscv_aclint_swi_create(OBJECT(dev), shakti_c_memmap[SHAKTI_C_CLINT].base,
0, 1, false);
- riscv_aclint_mtimer_create(shakti_c_memmap[SHAKTI_C_CLINT].base +
+ riscv_aclint_mtimer_create(OBJECT(dev),
+ shakti_c_memmap[SHAKTI_C_CLINT].base +
RISCV_ACLINT_SWI_SIZE,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, 1,
RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
index 71925583bd..dfdb7ae4c1 100644
--- a/hw/riscv/sifive_e.c
+++ b/hw/riscv/sifive_e.c
@@ -214,7 +214,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
memmap[SIFIVE_E_DEV_MROM].base, &s->mask_rom);
/* MMIO */
- s->plic = sifive_plic_create(memmap[SIFIVE_E_DEV_PLIC].base,
+ s->plic = sifive_plic_create(OBJECT(dev), memmap[SIFIVE_E_DEV_PLIC].base,
(char *)SIFIVE_E_PLIC_HART_CONFIG, ms->smp.cpus, 0,
SIFIVE_E_PLIC_NUM_SOURCES,
SIFIVE_E_PLIC_NUM_PRIORITIES,
@@ -225,9 +225,10 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
SIFIVE_E_PLIC_CONTEXT_BASE,
SIFIVE_E_PLIC_CONTEXT_STRIDE,
memmap[SIFIVE_E_DEV_PLIC].size);
- riscv_aclint_swi_create(memmap[SIFIVE_E_DEV_CLINT].base,
+ riscv_aclint_swi_create(OBJECT(dev), memmap[SIFIVE_E_DEV_CLINT].base,
0, ms->smp.cpus, false);
- riscv_aclint_mtimer_create(memmap[SIFIVE_E_DEV_CLINT].base +
+ riscv_aclint_mtimer_create(OBJECT(dev),
+ memmap[SIFIVE_E_DEV_CLINT].base +
RISCV_ACLINT_SWI_SIZE,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index 47ce75ef11..41eb22dc02 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -771,7 +771,7 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
plic_hart_config = riscv_plic_hart_config_string(ms->smp.cpus);
/* MMIO */
- s->plic = sifive_plic_create(memmap[SIFIVE_U_DEV_PLIC].base,
+ s->plic = sifive_plic_create(OBJECT(dev), memmap[SIFIVE_U_DEV_PLIC].base,
plic_hart_config, ms->smp.cpus, 0,
SIFIVE_U_PLIC_NUM_SOURCES,
SIFIVE_U_PLIC_NUM_PRIORITIES,
@@ -787,9 +787,10 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
serial_hd(0), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_U_UART0_IRQ));
sifive_uart_create(system_memory, memmap[SIFIVE_U_DEV_UART1].base,
serial_hd(1), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_U_UART1_IRQ));
- riscv_aclint_swi_create(memmap[SIFIVE_U_DEV_CLINT].base, 0,
+ riscv_aclint_swi_create(OBJECT(dev), memmap[SIFIVE_U_DEV_CLINT].base, 0,
ms->smp.cpus, false);
- riscv_aclint_mtimer_create(memmap[SIFIVE_U_DEV_CLINT].base +
+ riscv_aclint_mtimer_create(OBJECT(dev),
+ memmap[SIFIVE_U_DEV_CLINT].base +
RISCV_ACLINT_SWI_SIZE,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
index 9fde0faf39..c53409e4f1 100644
--- a/hw/riscv/spike.c
+++ b/hw/riscv/spike.c
@@ -163,10 +163,10 @@ static void spike_board_init(MachineState *machine)
sysbus_realize(SYS_BUS_DEVICE(&s->soc[i]), &error_fatal);
/* Core Local Interruptor (timer and IPI) for each socket */
- riscv_aclint_swi_create(
+ riscv_aclint_swi_create(OBJECT(machine),
memmap[SPIKE_CLINT].base + i * memmap[SPIKE_CLINT].size,
base_hartid, hart_count, false);
- riscv_aclint_mtimer_create(
+ riscv_aclint_mtimer_create(OBJECT(machine),
memmap[SPIKE_CLINT].base + i * memmap[SPIKE_CLINT].size +
RISCV_ACLINT_SWI_SIZE,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE, base_hartid, hart_count,
diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c
index c3be7eb913..6c12d85460 100644
--- a/hw/riscv/tt_atlantis.c
+++ b/hw/riscv/tt_atlantis.c
@@ -494,7 +494,8 @@ static void tt_atlantis_machine_init(MachineState *machine)
&error_abort);
sysbus_realize(SYS_BUS_DEVICE(&s->soc), &error_fatal);
- s->irqchip = riscv_create_aia(true, TT_IRQCHIP_GUESTS,
+ s->irqchip = riscv_create_aia(OBJECT(machine),
+ true, TT_IRQCHIP_GUESTS,
TT_IRQCHIP_MIMSIC_STRIDE,
TT_IRQCHIP_NUM_SOURCES,
&s->memmap[TT_ATL_MAPLIC],
@@ -505,7 +506,8 @@ static void tt_atlantis_machine_init(MachineState *machine)
TT_IRQCHIP_NUM_MSIS,
TT_IRQCHIP_NUM_PRIO_BITS);
- riscv_aclint_mtimer_create(s->memmap[TT_ATL_ACLINT].base,
+ riscv_aclint_mtimer_create(OBJECT(machine),
+ s->memmap[TT_ATL_ACLINT].base,
TT_ACLINT_MTIME_SIZE,
0, hart_count,
TT_ACLINT_MTIMECMP,
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index 44e1cfa7be..3ceb476b84 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -1115,7 +1115,8 @@ static FWCfgState *create_fw_cfg(const MachineState *ms, hwaddr base)
return fw_cfg;
}
-static DeviceState *virt_create_plic(const MemMapEntry *memmap, int socket,
+static DeviceState *virt_create_plic(Object *parent,
+ const MemMapEntry *memmap, int socket,
int base_hartid, int hart_count)
{
g_autofree char *plic_hart_config = NULL;
@@ -1124,7 +1125,7 @@ static DeviceState *virt_create_plic(const MemMapEntry *memmap, int socket,
plic_hart_config = riscv_plic_hart_config_string(hart_count);
/* Per-socket PLIC */
- return sifive_plic_create(
+ return sifive_plic_create(parent,
memmap[VIRT_PLIC].base + socket * memmap[VIRT_PLIC].size,
plic_hart_config, hart_count, base_hartid,
VIRT_IRQCHIP_NUM_SOURCES,
@@ -1357,7 +1358,8 @@ static void virt_machine_init(MachineState *machine)
if (virt_aclint_allowed() && s->have_aclint) {
if (s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) {
/* Per-socket ACLINT MTIMER */
- riscv_aclint_mtimer_create(s->memmap[VIRT_CLINT].base +
+ riscv_aclint_mtimer_create(OBJECT(machine),
+ s->memmap[VIRT_CLINT].base +
i * RISCV_ACLINT_DEFAULT_MTIMER_SIZE,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE,
base_hartid, hart_count,
@@ -1366,10 +1368,12 @@ static void virt_machine_init(MachineState *machine)
RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true);
} else {
/* Per-socket ACLINT MSWI, MTIMER, and SSWI */
- riscv_aclint_swi_create(s->memmap[VIRT_CLINT].base +
+ riscv_aclint_swi_create(OBJECT(machine),
+ s->memmap[VIRT_CLINT].base +
i * s->memmap[VIRT_CLINT].size,
base_hartid, hart_count, false);
- riscv_aclint_mtimer_create(s->memmap[VIRT_CLINT].base +
+ riscv_aclint_mtimer_create(OBJECT(machine),
+ s->memmap[VIRT_CLINT].base +
i * s->memmap[VIRT_CLINT].size +
RISCV_ACLINT_SWI_SIZE,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE,
@@ -1377,16 +1381,18 @@ static void virt_machine_init(MachineState *machine)
RISCV_ACLINT_DEFAULT_MTIMECMP,
RISCV_ACLINT_DEFAULT_MTIME,
RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true);
- riscv_aclint_swi_create(s->memmap[VIRT_ACLINT_SSWI].base +
+ riscv_aclint_swi_create(OBJECT(machine),
+ s->memmap[VIRT_ACLINT_SSWI].base +
i * s->memmap[VIRT_ACLINT_SSWI].size,
base_hartid, hart_count, true);
}
} else if (tcg_enabled()) {
/* Per-socket SiFive CLINT */
- riscv_aclint_swi_create(
+ riscv_aclint_swi_create(OBJECT(machine),
s->memmap[VIRT_CLINT].base + i * s->memmap[VIRT_CLINT].size,
base_hartid, hart_count, false);
- riscv_aclint_mtimer_create(s->memmap[VIRT_CLINT].base +
+ riscv_aclint_mtimer_create(OBJECT(machine),
+ s->memmap[VIRT_CLINT].base +
i * s->memmap[VIRT_CLINT].size + RISCV_ACLINT_SWI_SIZE,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE, base_hartid, hart_count,
RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
@@ -1395,10 +1401,11 @@ static void virt_machine_init(MachineState *machine)
/* Per-socket interrupt controller */
if (s->aia_type == VIRT_AIA_TYPE_NONE) {
- s->irqchip[i] = virt_create_plic(s->memmap, i,
+ s->irqchip[i] = virt_create_plic(OBJECT(machine), s->memmap, i,
base_hartid, hart_count);
} else {
- s->irqchip[i] = riscv_create_aia(s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC,
+ s->irqchip[i] = riscv_create_aia(OBJECT(machine),
+ s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC,
s->aia_guests,
IMSIC_HART_SIZE(0),
s->num_sources,
diff --git a/hw/riscv/xiangshan_kmh.c b/hw/riscv/xiangshan_kmh.c
index 384624d69a..c1c10e9456 100644
--- a/hw/riscv/xiangshan_kmh.c
+++ b/hw/riscv/xiangshan_kmh.c
@@ -55,7 +55,8 @@ static const MemMapEntry xiangshan_kmh_memmap[] = {
[XIANGSHAN_KMH_DRAM] = { 0x80000000, 0x0 },
};
-static DeviceState *xiangshan_kmh_create_aia(uint32_t num_harts)
+static DeviceState *xiangshan_kmh_create_aia(Object *parent,
+ uint32_t num_harts)
{
int i;
const MemMapEntry *memmap = xiangshan_kmh_memmap;
@@ -65,27 +66,27 @@ static DeviceState *xiangshan_kmh_create_aia(uint32_t num_harts)
/* M-level IMSICs */
addr = memmap[XIANGSHAN_KMH_IMSIC_M].base;
for (i = 0; i < num_harts; i++) {
- riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0), i, true,
+ riscv_imsic_create(parent, addr + i * IMSIC_HART_SIZE(0), i, true,
1, XIANGSHAN_KMH_IMSIC_NUM_IDS);
}
/* S-level IMSICs */
addr = memmap[XIANGSHAN_KMH_IMSIC_S].base;
for (i = 0; i < num_harts; i++) {
- riscv_imsic_create(addr +
+ riscv_imsic_create(parent, addr +
i * IMSIC_HART_SIZE(XIANGSHAN_KMH_IMSIC_GUEST_BITS),
i, false, 1 + XIANGSHAN_KMH_IMSIC_GUEST_BITS,
XIANGSHAN_KMH_IMSIC_NUM_IDS);
}
/* M-level APLIC */
- aplic_m = riscv_aplic_create(memmap[XIANGSHAN_KMH_APLIC_M].base,
+ aplic_m = riscv_aplic_create(parent, memmap[XIANGSHAN_KMH_APLIC_M].base,
memmap[XIANGSHAN_KMH_APLIC_M].size,
0, 0, XIANGSHAN_KMH_APLIC_NUM_SOURCES,
1, true, true, NULL);
/* S-level APLIC */
- riscv_aplic_create(memmap[XIANGSHAN_KMH_APLIC_S].base,
+ riscv_aplic_create(parent, memmap[XIANGSHAN_KMH_APLIC_S].base,
memmap[XIANGSHAN_KMH_APLIC_S].size,
0, 0, XIANGSHAN_KMH_APLIC_NUM_SOURCES,
1, true, false, aplic_m);
@@ -108,7 +109,7 @@ static void xiangshan_kmh_soc_realize(DeviceState *dev, Error **errp)
sysbus_realize(SYS_BUS_DEVICE(&s->cpus), &error_fatal);
/* AIA */
- s->irqchip = xiangshan_kmh_create_aia(num_harts);
+ s->irqchip = xiangshan_kmh_create_aia(OBJECT(dev), num_harts);
/* UART */
serial_mm_init(system_memory, memmap[XIANGSHAN_KMH_UART0].base, 2,
@@ -116,9 +117,10 @@ static void xiangshan_kmh_soc_realize(DeviceState *dev, Error **errp)
115200, serial_hd(0), DEVICE_LITTLE_ENDIAN);
/* CLINT */
- riscv_aclint_swi_create(memmap[XIANGSHAN_KMH_CLINT].base,
+ riscv_aclint_swi_create(OBJECT(dev), memmap[XIANGSHAN_KMH_CLINT].base,
0, num_harts, false);
- riscv_aclint_mtimer_create(memmap[XIANGSHAN_KMH_CLINT].base +
+ riscv_aclint_mtimer_create(OBJECT(dev),
+ memmap[XIANGSHAN_KMH_CLINT].base +
RISCV_ACLINT_SWI_SIZE,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE,
0, num_harts, RISCV_ACLINT_DEFAULT_MTIMECMP,
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index d4b6d3ed57..dbaf61bcf1 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -191,7 +191,7 @@ void pc_basic_device_init(struct PCMachineState *pcms,
uint32_t hpet_irqs);
void pc_nic_init(PCMachineClass *pcmc, ISABus *isa_bus, PCIBus *pci_bus);
-void pc_i8259_create(ISABus *isa_bus, qemu_irq *i8259_irqs);
+void pc_i8259_create(Object *parent, ISABus *isa_bus, qemu_irq *i8259_irqs);
/* port92.c */
#define PORT92_A20_LINE "a20"
diff --git a/include/hw/intc/i8259.h b/include/hw/intc/i8259.h
index 1f2420231f..9aa89890b1 100644
--- a/include/hw/intc/i8259.h
+++ b/include/hw/intc/i8259.h
@@ -14,8 +14,8 @@ extern PICCommonState *isa_pic;
* connect its output to @parent_irq_in,
* return an (allocated) array of 16 input IRQs.
*/
-qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq_in);
-qemu_irq *kvm_i8259_init(ISABus *bus);
+qemu_irq *i8259_init(Object *parent, ISABus *bus, qemu_irq parent_irq_in);
+qemu_irq *kvm_i8259_init(Object *parent, ISABus *bus);
int pic_get_output(PICCommonState *s);
int pic_read_irq(PICCommonState *s);
diff --git a/include/hw/intc/riscv_aclint.h b/include/hw/intc/riscv_aclint.h
index 0e0b98acb0..18c70fd3c7 100644
--- a/include/hw/intc/riscv_aclint.h
+++ b/include/hw/intc/riscv_aclint.h
@@ -46,7 +46,8 @@ typedef struct RISCVAclintMTimerState {
qemu_irq *timer_irqs;
} RISCVAclintMTimerState;
-DeviceState *riscv_aclint_mtimer_create(hwaddr addr, hwaddr size,
+DeviceState *riscv_aclint_mtimer_create(Object *parent,
+ hwaddr addr, hwaddr size,
uint32_t hartid_base, uint32_t num_harts,
uint32_t timecmp_base, uint32_t time_base, uint32_t timebase_freq,
bool provide_rdtime);
@@ -68,7 +69,8 @@ typedef struct RISCVAclintSwiState {
qemu_irq *soft_irqs;
} RISCVAclintSwiState;
-DeviceState *riscv_aclint_swi_create(hwaddr addr, uint32_t hartid_base,
+DeviceState *riscv_aclint_swi_create(Object *parent, hwaddr addr,
+ uint32_t hartid_base,
uint32_t num_harts, bool sswi);
enum {
diff --git a/include/hw/intc/riscv_aplic.h b/include/hw/intc/riscv_aplic.h
index c7a4d4ad01..8d45120f48 100644
--- a/include/hw/intc/riscv_aplic.h
+++ b/include/hw/intc/riscv_aplic.h
@@ -80,8 +80,9 @@ bool riscv_is_kvm_aia_aplic_imsic(bool msimode);
bool riscv_use_emulated_aplic(bool msimode);
void riscv_aplic_set_kvm_msicfgaddr(RISCVAPLICState *aplic, hwaddr addr);
-DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size,
+DeviceState *riscv_aplic_create(Object *parent, hwaddr addr, hwaddr size,
uint32_t hartid_base, uint32_t num_harts, uint32_t num_sources,
- uint32_t iprio_bits, bool msimode, bool mmode, DeviceState *parent);
+ uint32_t iprio_bits, bool msimode, bool mmode,
+ DeviceState *aplic_parent);
#endif
diff --git a/include/hw/intc/riscv_imsic.h b/include/hw/intc/riscv_imsic.h
index fae999731d..c46232fbc4 100644
--- a/include/hw/intc/riscv_imsic.h
+++ b/include/hw/intc/riscv_imsic.h
@@ -62,7 +62,8 @@ struct RISCVIMSICState {
uint32_t num_irqs;
};
-DeviceState *riscv_imsic_create(hwaddr addr, uint32_t hartid, bool mmode,
+DeviceState *riscv_imsic_create(Object *parent, hwaddr addr,
+ uint32_t hartid, bool mmode,
uint32_t num_pages, uint32_t num_ids);
#endif
diff --git a/include/hw/intc/sifive_plic.h b/include/hw/intc/sifive_plic.h
index 32973dbf28..9e67098ce4 100644
--- a/include/hw/intc/sifive_plic.h
+++ b/include/hw/intc/sifive_plic.h
@@ -76,7 +76,8 @@ struct SiFivePLICState {
qemu_irq *s_external_irqs;
};
-DeviceState *sifive_plic_create(hwaddr addr, char *hart_config,
+DeviceState *sifive_plic_create(Object *parent, hwaddr addr,
+ char *hart_config,
uint32_t num_harts,
uint32_t hartid_base, uint32_t num_sources,
uint32_t num_priorities, uint32_t priority_base,
diff --git a/include/hw/isa/i8259_internal.h b/include/hw/isa/i8259_internal.h
index f9dcc4163e..b351ac2672 100644
--- a/include/hw/isa/i8259_internal.h
+++ b/include/hw/isa/i8259_internal.h
@@ -71,7 +71,8 @@ struct PICCommonState {
};
void pic_reset_common(PICCommonState *s);
-ISADevice *i8259_init_chip(const char *name, ISABus *bus, bool master);
+ISADevice *i8259_init_chip(Object *parent, const char *name, ISABus *bus,
+ bool master);
void pic_stat_update_irq(int irq, int level);
#endif /* QEMU_I8259_INTERNAL_H */
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 023/134] hw/pci-host: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (21 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 022/134] hw/intc: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 024/134] hw/core: " Alexander Graf
` (111 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/pci-host to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/pci-host/articia.c:188 | OBJECT(dev) | "host-func" | articia_realize(): PCI-facing host function is composite child of the ArticiaS host bridge
hw/pci-host/articia.c:191 | OBJECT(dev) | "pci-bridge" | articia_realize(): on-chip PCI bridge is composite child of the ArticiaS host bridge
hw/pci-host/astro.c:524 | OBJECT(s) | "elroy[*]" | elroy_init() static helper called from astro_realize(); Elroy PCI host is composite child of the Astro chip; thread Object *parent from caller
hw/pci-host/bonito.c:744 | OBJECT(machine) | "pci-host" | bonito_init() public helper called from board init (fuloong2e); thread Object *parent from caller
hw/pci-host/bonito.c:750 | OBJECT(pcihost) | "pci" | PCI-facing Bonito function is composite child of the Bonito host-bridge SysBus device
hw/pci-host/grackle.c:63 | OBJECT(dev) | "pci" | grackle_realize(): PCI-facing grackle function is composite child of the host bridge
hw/pci-host/gt64120.c:1207 | OBJECT(dev) | "pci" | gt64120_realize(): PCI-facing GT-64120 function is composite child of the host bridge
hw/pci-host/i440fx.c:285 | OBJECT(dev) | "pci" | i440fx_pcihost_realize(): i440FX PCI function is composite child of the host bridge
hw/pci-host/mv64361.c:97 | OBJECT(dev) | "pci" | mv64361_pcihost_realize(): PCI-facing MV64361 bridge function is composite child of the host bridge
hw/pci-host/pnv_phb.c:170 | OBJECT(dev) | "root-port" | pnv_phb_realize(): built-in PHB root port is composite child of the PnvPHB proxy device
hw/pci-host/pnv_phb4_pec.c:183 | OBJECT(pec) | "phb[*]" | pnv_pec_default_phb_realize() called from pnv_pec_realize(); already parented via object_property_add_child(pec,"phb[*]",...); fold into qdev_new()
hw/pci-host/ppc4xx_pci.c:335 | OBJECT(dev) | "pci" | ppc4xx_pcihost_realize(): PCI-facing 4xx host bridge function is composite child of the host bridge
hw/pci-host/ppce500.c:476 | OBJECT(dev) | "pci" | e500_pcihost_realize(): PCI-facing e500 bridge function is composite child of the host bridge
hw/pci-host/raven.c:284 | OBJECT(d) | "pci" | raven_pcihost_realizefn(DeviceState *d,...): PCI-facing Raven function is composite child of the host bridge
hw/pci-host/sabre.c:386 | OBJECT(dev) | "pci" | sabre_realize(): PCI-facing Sabre function is composite child of the host bridge
hw/pci-host/sabre.c:394 | OBJECT(dev) | "bridge-b" | sabre_realize(): on-board Simba PCI bridge B is composite child of the Sabre host bridge
hw/pci-host/sabre.c:399 | OBJECT(dev) | "bridge-a" | sabre_realize(): on-board Simba PCI bridge A is composite child of the Sabre host bridge
hw/pci-host/sh_pci.c:145 | OBJECT(dev) | "pci" | sh_pcic_host_realize(): PCI-facing SH host function is composite child of the host bridge
hw/pci-host/uninorth.c:129 | OBJECT(dev) | "pci" | pci_unin_main_realize(): PCI-facing UniNorth function is composite child of the host bridge
hw/pci-host/uninorth.c:179 | OBJECT(dev) | "pci" | pci_u3_agp_realize(): PCI-facing U3-AGP function is composite child of the host bridge
hw/pci-host/uninorth.c:223 | OBJECT(dev) | "pci" | pci_unin_agp_realize(): PCI-facing UniNorth-AGP function is composite child of the host bridge
hw/pci-host/uninorth.c:256 | OBJECT(dev) | "pci" | pci_unin_internal_realize(): PCI-facing internal-UniNorth function is composite child of the host bridge
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/mips/fuloong2e.c | 2 +-
hw/pci-host/articia.c | 6 ++++--
hw/pci-host/astro.c | 8 ++++----
hw/pci-host/bonito.c | 10 +++++-----
hw/pci-host/grackle.c | 2 +-
hw/pci-host/gt64120.c | 3 ++-
hw/pci-host/i440fx.c | 2 +-
hw/pci-host/mv64361.c | 2 +-
hw/pci-host/pnv_phb.c | 5 +++--
hw/pci-host/pnv_phb4_pec.c | 3 +--
hw/pci-host/ppc4xx_pci.c | 2 +-
hw/pci-host/ppce500.c | 2 +-
hw/pci-host/raven.c | 3 ++-
hw/pci-host/sabre.c | 12 +++++++-----
hw/pci-host/sh_pci.c | 3 ++-
hw/pci-host/uninorth.c | 11 +++++++----
include/hw/mips/mips.h | 2 +-
17 files changed, 44 insertions(+), 34 deletions(-)
diff --git a/hw/mips/fuloong2e.c b/hw/mips/fuloong2e.c
index e0cbf4df3d..5e5ade46f3 100644
--- a/hw/mips/fuloong2e.c
+++ b/hw/mips/fuloong2e.c
@@ -283,7 +283,7 @@ static void mips_fuloong2e_init(MachineState *machine)
cpu_mips_clock_init(cpu);
/* North bridge, Bonito --> IP2 */
- pci_bus = bonito_init((qemu_irq *)&(env->irq[2]));
+ pci_bus = bonito_init(OBJECT(machine), (qemu_irq *)&(env->irq[2]));
/* South bridge -> IP5 */
pci_dev = pci_new_multifunction_orphan(PCI_DEVFN(FULOONG2E_VIA_SLOT, 0),
diff --git a/hw/pci-host/articia.c b/hw/pci-host/articia.c
index 0556c0ccff..5ec0e6a05f 100644
--- a/hw/pci-host/articia.c
+++ b/hw/pci-host/articia.c
@@ -185,10 +185,12 @@ static void articia_realize(DeviceState *dev, Error **errp)
h->bus = pci_register_root_bus(dev, NULL, articia_pcihost_set_irq,
amigaone_pcihost_bus0_map_irq, dev, &s->mem,
&s->io, PCI_DEVFN(8, 0), 4, TYPE_PCI_BUS);
- pdev = pci_create_simple_multifunction_orphan(h->bus, PCI_DEVFN(0, 0),
+ pdev = pci_create_simple_multifunction(OBJECT(dev), "host-func", h->bus,
+ PCI_DEVFN(0, 0),
TYPE_ARTICIA_PCI_HOST);
ARTICIA_PCI_HOST(pdev)->as = s;
- pci_create_simple_orphan(h->bus, PCI_DEVFN(0, 1), TYPE_ARTICIA_PCI_BRIDGE);
+ pci_create_simple(OBJECT(dev), "pci-bridge", h->bus, PCI_DEVFN(0, 1),
+ TYPE_ARTICIA_PCI_BRIDGE);
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->reg);
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mem);
diff --git a/hw/pci-host/astro.c b/hw/pci-host/astro.c
index 1de3960713..61519d1d29 100644
--- a/hw/pci-host/astro.c
+++ b/hw/pci-host/astro.c
@@ -517,13 +517,13 @@ static void elroy_register_types(void)
type_init(elroy_register_types)
-static ElroyState *elroy_init(int num)
+static ElroyState *elroy_init(Object *parent, int num)
{
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_ELROY_PCI_HOST_BRIDGE);
+ dev = qdev_new(parent, "elroy[*]", TYPE_ELROY_PCI_HOST_BRIDGE);
dev->id = g_strdup_printf("elroy%d", num);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
return ELROY_PCI_HOST_BRIDGE(dev);
}
@@ -1015,7 +1015,7 @@ static void astro_realize(DeviceState *obj, Error **errp)
addr_offset = elroy_hpa_offsets[i];
rope = elroy_rope_nr[i];
- elroy = elroy_init(i);
+ elroy = elroy_init(OBJECT(s), i);
s->elroy[i] = elroy;
elroy->hpa = ASTRO_HPA + addr_offset;
elroy->pci_bus_num = i;
diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c
index 40a62d62b6..83b328840a 100644
--- a/hw/pci-host/bonito.c
+++ b/hw/pci-host/bonito.c
@@ -733,7 +733,7 @@ static void bonito_pci_realize(PCIDevice *dev, Error **errp)
pci_set_byte(dev->config + PCI_MAX_LAT, 0x00);
}
-PCIBus *bonito_init(qemu_irq *pic)
+PCIBus *bonito_init(Object *parent, qemu_irq *pic)
{
DeviceState *dev;
BonitoState *pcihost;
@@ -741,17 +741,17 @@ PCIBus *bonito_init(qemu_irq *pic)
PCIBonitoState *s;
PCIDevice *d;
- dev = qdev_new_orphan(TYPE_BONITO_PCI_HOST_BRIDGE);
+ dev = qdev_new(parent, "pci-host", TYPE_BONITO_PCI_HOST_BRIDGE);
phb = PCI_HOST_BRIDGE(dev);
pcihost = BONITO_PCI_HOST_BRIDGE(dev);
pcihost->pic = pic;
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
- d = pci_new_orphan(PCI_DEVFN(0, 0), TYPE_PCI_BONITO);
+ d = pci_new(OBJECT(pcihost), "pci-host", PCI_DEVFN(0, 0), TYPE_PCI_BONITO);
s = PCI_BONITO(d);
s->pcihost = pcihost;
pcihost->pci_dev = s;
- pci_realize_and_unref(d, phb->bus, &error_fatal);
+ qdev_realize(DEVICE(d), BUS(phb->bus), &error_fatal);
return phb->bus;
}
diff --git a/hw/pci-host/grackle.c b/hw/pci-host/grackle.c
index c76cb61dc9..c4c8dc15e4 100644
--- a/hw/pci-host/grackle.c
+++ b/hw/pci-host/grackle.c
@@ -60,7 +60,7 @@ static void grackle_realize(DeviceState *dev, Error **errp)
&s->pci_io,
0, 4, TYPE_PCI_BUS);
- pci_create_simple_orphan(phb->bus, 0, "grackle");
+ pci_create_simple(OBJECT(dev), "pci-host", phb->bus, 0, "grackle");
}
static void grackle_init(Object *obj)
diff --git a/hw/pci-host/gt64120.c b/hw/pci-host/gt64120.c
index c1a94a3daa..780c86cd9a 100644
--- a/hw/pci-host/gt64120.c
+++ b/hw/pci-host/gt64120.c
@@ -1204,7 +1204,8 @@ static void gt64120_realize(DeviceState *dev, Error **errp)
get_system_io(),
PCI_DEVFN(18, 0), TYPE_PCI_BUS);
- pci_create_simple_orphan(phb->bus, PCI_DEVFN(0, 0), "gt64120_pci");
+ pci_create_simple(OBJECT(dev), "pci-host", phb->bus, PCI_DEVFN(0, 0),
+ "gt64120_pci");
memory_region_init_io(&phb->conf_mem, OBJECT(phb),
&pci_host_conf_le_ops,
s, "pci-conf-idx", 4);
diff --git a/hw/pci-host/i440fx.c b/hw/pci-host/i440fx.c
index e91ddd5d07..c49b5d5c15 100644
--- a/hw/pci-host/i440fx.c
+++ b/hw/pci-host/i440fx.c
@@ -282,7 +282,7 @@ static void i440fx_pcihost_realize(DeviceState *dev, Error **errp)
s->io_memory, 0, TYPE_PCI_BUS);
phb->bus = b;
- d = pci_create_simple_orphan(b, 0, s->pci_type);
+ d = pci_create_simple(OBJECT(dev), "pci-host", b, 0, s->pci_type);
f = I440FX_PCI_DEVICE(d);
range_set_bounds(&s->pci_hole, s->below_4g_mem_size,
diff --git a/hw/pci-host/mv64361.c b/hw/pci-host/mv64361.c
index f75951c873..3ef51fef1b 100644
--- a/hw/pci-host/mv64361.c
+++ b/hw/pci-host/mv64361.c
@@ -94,7 +94,7 @@ static void mv64361_pcihost_realize(DeviceState *dev, Error **errp)
pci_swizzle_map_irq_fn, dev,
&s->mem, &s->io, 0, 4, TYPE_PCI_BUS);
g_free(name);
- pci_create_simple_orphan(h->bus, 0, TYPE_MV64361_PCI_BRIDGE);
+ pci_create_simple(OBJECT(dev), "pci-host", h->bus, 0, TYPE_MV64361_PCI_BRIDGE);
qdev_init_gpio_out(dev, s->irq, ARRAY_SIZE(s->irq));
}
diff --git a/hw/pci-host/pnv_phb.c b/hw/pci-host/pnv_phb.c
index fc0b226bef..160aa86c48 100644
--- a/hw/pci-host/pnv_phb.c
+++ b/hw/pci-host/pnv_phb.c
@@ -167,9 +167,10 @@ static void pnv_phb_realize(DeviceState *dev, Error **errp)
}
if (defaults_enabled()) {
- PCIDevice *root = pci_new_orphan(PCI_DEVFN(0, 0), TYPE_PNV_PHB_ROOT_PORT);
+ PCIDevice *root = pci_new(OBJECT(dev), "root-port",
+ PCI_DEVFN(0, 0), TYPE_PNV_PHB_ROOT_PORT);
- pci_realize_and_unref(root, pci->bus, errp);
+ qdev_realize(DEVICE(root), BUS(pci->bus), errp);
}
}
diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c
index 54dac5e989..b1af93d49b 100644
--- a/hw/pci-host/pnv_phb4_pec.c
+++ b/hw/pci-host/pnv_phb4_pec.c
@@ -180,10 +180,9 @@ static PnvPHB *pnv_pec_default_phb_realize(PnvPhb4PecState *pec,
int stack_no,
Error **errp)
{
- PnvPHB *phb = PNV_PHB(qdev_new_orphan(TYPE_PNV_PHB));
+ PnvPHB *phb = PNV_PHB(qdev_new(OBJECT(pec), "phb[*]", TYPE_PNV_PHB));
int phb_id = pnv_phb4_pec_get_phb_id(pec, stack_no);
- object_property_add_child(OBJECT(pec), "phb[*]", OBJECT(phb));
object_property_set_link(OBJECT(phb), "pec", OBJECT(pec),
&error_abort);
object_property_set_int(OBJECT(phb), "chip-id", pec->chip_id,
diff --git a/hw/pci-host/ppc4xx_pci.c b/hw/pci-host/ppc4xx_pci.c
index cd7b16aa87..223b37354b 100644
--- a/hw/pci-host/ppc4xx_pci.c
+++ b/hw/pci-host/ppc4xx_pci.c
@@ -332,7 +332,7 @@ static void ppc4xx_pcihost_realize(DeviceState *dev, Error **errp)
TYPE_PCI_BUS);
h->bus = b;
- pci_create_simple_orphan(b, 0, TYPE_PPC4xx_HOST_BRIDGE);
+ pci_create_simple(OBJECT(dev), "pci-host", b, 0, TYPE_PPC4xx_HOST_BRIDGE);
/* XXX split into 2 memory regions, one for config space, one for regs */
memory_region_init(&s->container, OBJECT(s), "pci-container", PCI_ALL_SIZE);
diff --git a/hw/pci-host/ppce500.c b/hw/pci-host/ppce500.c
index 838a01608c..01576c1a61 100644
--- a/hw/pci-host/ppce500.c
+++ b/hw/pci-host/ppce500.c
@@ -473,7 +473,7 @@ static void e500_pcihost_realize(DeviceState *dev, Error **errp)
address_space_init(&s->bm_as, &s->bm, "pci-bm");
pci_setup_iommu(b, &ppce500_iommu_ops, s);
- pci_create_simple_orphan(b, 0, TYPE_PPC_E500_PCI_BRIDGE);
+ pci_create_simple(OBJECT(dev), "pci-host", b, 0, TYPE_PPC_E500_PCI_BRIDGE);
memory_region_init(&s->container, OBJECT(h), "pci-container", PCIE500_ALL_SIZE);
memory_region_init_io(&h->conf_mem, OBJECT(h), &pci_host_conf_be_ops, h,
diff --git a/hw/pci-host/raven.c b/hw/pci-host/raven.c
index abcf9b28e1..b6ab686ff5 100644
--- a/hw/pci-host/raven.c
+++ b/hw/pci-host/raven.c
@@ -281,7 +281,8 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)
"pci-intack", 1);
memory_region_add_subregion(address_space_mem, 0xbffffff0, &s->pci_intack);
- pci_create_simple_orphan(h->bus, PCI_DEVFN(0, 0), TYPE_RAVEN_PCI_DEVICE);
+ pci_create_simple(OBJECT(d), "pci-host", h->bus, PCI_DEVFN(0, 0),
+ TYPE_RAVEN_PCI_DEVICE);
address_space_init(&s->bm_as, &s->bm, "raven-bm");
pci_setup_iommu(h->bus, &raven_iommu_ops, s);
diff --git a/hw/pci-host/sabre.c b/hw/pci-host/sabre.c
index d8c815d404..3c52fa2727 100644
--- a/hw/pci-host/sabre.c
+++ b/hw/pci-host/sabre.c
@@ -383,7 +383,7 @@ static void sabre_realize(DeviceState *dev, Error **errp)
&s->pci_ioport,
0, 0x40, TYPE_PCI_BUS);
- pci_create_simple_orphan(phb->bus, 0, TYPE_SABRE_PCI_DEVICE);
+ pci_create_simple(OBJECT(dev), "pci-host", phb->bus, 0, TYPE_SABRE_PCI_DEVICE);
/* IOMMU */
memory_region_add_subregion_overlap(&s->sabre_config, 0x200,
@@ -391,15 +391,17 @@ static void sabre_realize(DeviceState *dev, Error **errp)
pci_setup_iommu(phb->bus, &sabre_iommu_ops, s->iommu);
/* APB secondary busses */
- pci_dev = pci_new_multifunction_orphan(PCI_DEVFN(1, 0), TYPE_SIMBA_PCI_BRIDGE);
+ pci_dev = pci_new_multifunction(OBJECT(dev), "bridge-b",
+ PCI_DEVFN(1, 0), TYPE_SIMBA_PCI_BRIDGE);
s->bridgeB = PCI_BRIDGE(pci_dev);
pci_bridge_map_irq(s->bridgeB, "pciB", pci_simbaB_map_irq);
- pci_realize_and_unref(pci_dev, phb->bus, &error_fatal);
+ qdev_realize(DEVICE(pci_dev), BUS(phb->bus), &error_fatal);
- pci_dev = pci_new_multifunction_orphan(PCI_DEVFN(1, 1), TYPE_SIMBA_PCI_BRIDGE);
+ pci_dev = pci_new_multifunction(OBJECT(dev), "bridge-a",
+ PCI_DEVFN(1, 1), TYPE_SIMBA_PCI_BRIDGE);
s->bridgeA = PCI_BRIDGE(pci_dev);
pci_bridge_map_irq(s->bridgeA, "pciA", pci_simbaA_map_irq);
- pci_realize_and_unref(pci_dev, phb->bus, &error_fatal);
+ qdev_realize(DEVICE(pci_dev), BUS(phb->bus), &error_fatal);
}
static void sabre_init(Object *obj)
diff --git a/hw/pci-host/sh_pci.c b/hw/pci-host/sh_pci.c
index 749b9d76a1..79ebe36fe1 100644
--- a/hw/pci-host/sh_pci.c
+++ b/hw/pci-host/sh_pci.c
@@ -142,7 +142,8 @@ static void sh_pcic_host_realize(DeviceState *dev, Error **errp)
sysbus_init_mmio(sbd, &s->memconfig_a7);
memory_region_add_subregion(get_system_memory(), 0xfe240000, &s->isa);
- s->dev = pci_create_simple_orphan(phb->bus, PCI_DEVFN(0, 0), "sh_pci_host");
+ s->dev = pci_create_simple(OBJECT(dev), "pci-host", phb->bus, PCI_DEVFN(0, 0),
+ "sh_pci_host");
}
static void sh_pcic_pci_realize(PCIDevice *d, Error **errp)
diff --git a/hw/pci-host/uninorth.c b/hw/pci-host/uninorth.c
index 4590687bd3..ac22f2dd8c 100644
--- a/hw/pci-host/uninorth.c
+++ b/hw/pci-host/uninorth.c
@@ -126,7 +126,8 @@ static void pci_unin_main_realize(DeviceState *dev, Error **errp)
&s->pci_io,
PCI_DEVFN(11, 0), 4, TYPE_PCI_BUS);
- pci_create_simple_orphan(h->bus, PCI_DEVFN(11, 0), "uni-north-pci");
+ pci_create_simple(OBJECT(dev), "pci-host", h->bus, PCI_DEVFN(11, 0),
+ "uni-north-pci");
/*
* DEC 21154 bridge was unused for many years, this comment is
@@ -176,7 +177,7 @@ static void pci_u3_agp_realize(DeviceState *dev, Error **errp)
&s->pci_io,
PCI_DEVFN(11, 0), 4, TYPE_PCI_BUS);
- pci_create_simple_orphan(h->bus, PCI_DEVFN(11, 0), "u3-agp");
+ pci_create_simple(OBJECT(dev), "pci-host", h->bus, PCI_DEVFN(11, 0), "u3-agp");
}
static void pci_u3_agp_init(Object *obj)
@@ -220,7 +221,8 @@ static void pci_unin_agp_realize(DeviceState *dev, Error **errp)
&s->pci_io,
PCI_DEVFN(11, 0), 4, TYPE_PCI_BUS);
- pci_create_simple_orphan(h->bus, PCI_DEVFN(11, 0), "uni-north-agp");
+ pci_create_simple(OBJECT(dev), "pci-host", h->bus, PCI_DEVFN(11, 0),
+ "uni-north-agp");
}
static void pci_unin_agp_init(Object *obj)
@@ -253,7 +255,8 @@ static void pci_unin_internal_realize(DeviceState *dev, Error **errp)
&s->pci_io,
PCI_DEVFN(14, 0), 4, TYPE_PCI_BUS);
- pci_create_simple_orphan(h->bus, PCI_DEVFN(14, 0), "uni-north-internal-pci");
+ pci_create_simple(OBJECT(dev), "pci-host", h->bus, PCI_DEVFN(14, 0),
+ "uni-north-internal-pci");
}
static void pci_unin_internal_init(Object *obj)
diff --git a/include/hw/mips/mips.h b/include/hw/mips/mips.h
index 1f3672ba5f..cd0ccb4e5d 100644
--- a/include/hw/mips/mips.h
+++ b/include/hw/mips/mips.h
@@ -10,7 +10,7 @@
#include "system/memory.h"
/* bonito.c */
-PCIBus *bonito_init(qemu_irq *pic);
+PCIBus *bonito_init(Object *parent, qemu_irq *pic);
/* rc4030.c */
typedef struct rc4030DMAState *rc4030_dma;
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 024/134] hw/core: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (22 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 023/134] hw/pci-host: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 025/134] hw/remote: " Alexander Graf
` (110 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/core to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/core/null-machine.c:28 | cpu_create | OBJECT(mch) | "cpu[*]" | Board init; machine owns CPU lifetime
hw/core/qdev.c:167,172 hw/core/sysbus.c:245,254 hw/core/cpu-common.c:71 | (definitions) | ORPHAN-JUSTIFIED | - | These are the *_orphan() implementations themselves
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/core/null-machine.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
index 7cc4b9ab3b..ac741bdf06 100644
--- a/hw/core/null-machine.c
+++ b/hw/core/null-machine.c
@@ -25,7 +25,7 @@ static void machine_none_init(MachineState *mch)
/* Initialize CPU (if user asked for it) */
if (mch->cpu_type) {
- cpu = cpu_create_orphan(mch->cpu_type);
+ cpu = cpu_create(OBJECT(mch), "cpu[*]", mch->cpu_type);
if (!cpu) {
error_report("Unable to initialize CPU");
exit(1);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 025/134] hw/remote: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (23 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 024/134] hw/core: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 026/134] hw/ufs: " Alexander Graf
` (109 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/remote to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/remote/machine.c:42 | qdev_new | OBJECT(s) | "remote-pcihost" | Board init; collapses existing object_property_add_child() with same name
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/remote/machine.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/hw/remote/machine.c b/hw/remote/machine.c
index 28cb48a4f6..e8e9cf259f 100644
--- a/hw/remote/machine.c
+++ b/hw/remote/machine.c
@@ -39,7 +39,8 @@ static void remote_machine_init(MachineState *machine)
pci_memory = g_new(MemoryRegion, 1);
memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
- rem_host = REMOTE_PCIHOST(qdev_new_orphan(TYPE_REMOTE_PCIHOST));
+ rem_host = REMOTE_PCIHOST(qdev_new(OBJECT(s), "remote-pcihost",
+ TYPE_REMOTE_PCIHOST));
rem_host->mr_pci_mem = pci_memory;
rem_host->mr_sys_mem = system_memory;
@@ -47,7 +48,6 @@ static void remote_machine_init(MachineState *machine)
s->host = rem_host;
- object_property_add_child(OBJECT(s), "remote-pcihost", OBJECT(rem_host));
memory_region_add_subregion_overlap(system_memory, 0x0, pci_memory, -1);
qdev_realize(DEVICE(rem_host), sysbus_get_default(), &error_fatal);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 026/134] hw/ufs: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (24 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 025/134] hw/remote: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 027/134] hw/nvme: " Alexander Graf
` (108 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/ufs to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/ufs/lu.c:475 | qdev_new | OBJECT(lu) | "ufs-scsi" | ufs-lu realize path; the LU device owns the wrapped scsi-hd (bus is not parent). Re-parent from bus to lu; drop _and_unref
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/ufs/lu.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/hw/ufs/lu.c b/hw/ufs/lu.c
index 219f74e4f3..4e5621f224 100644
--- a/hw/ufs/lu.c
+++ b/hw/ufs/lu.c
@@ -472,8 +472,7 @@ static void ufs_init_scsi_device(UfsLu *lu, BlockBackend *blk, Error **errp)
* The ufs-lu is the device that is wrapping the scsi-hd. It owns a virtual
* SCSI bus that serves the scsi-hd.
*/
- scsi_dev = qdev_new_orphan("scsi-hd");
- object_property_add_child(OBJECT(&lu->bus), "ufs-scsi", OBJECT(scsi_dev));
+ scsi_dev = qdev_new(OBJECT(lu), "ufs-scsi", "scsi-hd");
qdev_prop_set_uint32(scsi_dev, "physical_block_size", UFS_BLOCK_SIZE);
qdev_prop_set_uint32(scsi_dev, "logical_block_size", UFS_BLOCK_SIZE);
@@ -484,7 +483,7 @@ static void ufs_init_scsi_device(UfsLu *lu, BlockBackend *blk, Error **errp)
return;
}
- if (!qdev_realize_and_unref(scsi_dev, &lu->bus.qbus, errp)) {
+ if (!qdev_realize(scsi_dev, &lu->bus.qbus, errp)) {
object_unparent(OBJECT(scsi_dev));
return;
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 027/134] hw/nvme: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (25 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 026/134] hw/ufs: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 028/134] hw/vfio: " Alexander Graf
` (107 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/nvme to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/nvme/ctrl.c:9559 | qdev_new | OBJECT(n) | "subsys" | Called from nvme controller realize; the auto-created subsystem is owned by the controller that creates it
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/nvme/ctrl.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
index 300a5aa835..82a55c4536 100644
--- a/hw/nvme/ctrl.c
+++ b/hw/nvme/ctrl.c
@@ -9556,7 +9556,7 @@ static int nvme_init_subsys(NvmeCtrl *n, Error **errp)
int cntlid;
if (!n->subsys) {
- DeviceState *dev = qdev_new_orphan(TYPE_NVME_SUBSYS);
+ DeviceState *dev = qdev_new(OBJECT(n), "subsys", TYPE_NVME_SUBSYS);
qdev_prop_set_string(dev, "nqn", n->params.serial);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 028/134] hw/vfio: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (26 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 027/134] hw/nvme: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 029/134] hw/mem: " Alexander Graf
` (106 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/vfio to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/vfio/igd.c:337 | pci_create_simple | OBJECT(vdev) | "igd-lpc-bridge" | Called from IGD quirk during vfio-pci realize; the LPC stub is created by and lives with the passed-through IGD device
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/vfio/igd.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/hw/vfio/igd.c b/hw/vfio/igd.c
index bea0d57a11..aee40646ed 100644
--- a/hw/vfio/igd.c
+++ b/hw/vfio/igd.c
@@ -334,8 +334,9 @@ static int vfio_pci_igd_lpc_init(VFIOPCIDevice *vdev,
lpc_bridge = pci_find_device(pci_device_root_bus(pdev),
0, PCI_DEVFN(0x1f, 0));
if (!lpc_bridge) {
- lpc_bridge = pci_create_simple_orphan(pci_device_root_bus(pdev),
- PCI_DEVFN(0x1f, 0), "vfio-pci-igd-lpc-bridge");
+ lpc_bridge = pci_create_simple(OBJECT(vdev), "igd-lpc-bridge",
+ pci_device_root_bus(pdev),
+ PCI_DEVFN(0x1f, 0), "vfio-pci-igd-lpc-bridge");
}
ret = vfio_pci_igd_copy(vdev, lpc_bridge, info, igd_lpc_bridge_infos,
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 029/134] hw/mem: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (27 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 028/134] hw/vfio: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 030/134] hw/cxl: " Alexander Graf
` (105 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/mem to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/mem/sparse-mem.c:111 | qdev_new | parent (new arg) | "sparse-mem" | Public helper; thread Object *parent through. Only caller is generic_fuzz which passes qdev_get_machine()
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/mem/sparse-mem.c | 6 +++---
include/hw/mem/sparse-mem.h | 2 +-
tests/qtest/fuzz/generic_fuzz.c | 2 +-
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/hw/mem/sparse-mem.c b/hw/mem/sparse-mem.c
index 3310504578..fbf94eb8e7 100644
--- a/hw/mem/sparse-mem.c
+++ b/hw/mem/sparse-mem.c
@@ -104,14 +104,14 @@ static const Property sparse_mem_properties[] = {
DEFINE_PROP_UINT64("maxsize", SparseMemState, maxsize, 10 * MiB),
};
-MemoryRegion *sparse_mem_init(uint64_t addr, uint64_t length)
+MemoryRegion *sparse_mem_init(Object *parent, uint64_t addr, uint64_t length)
{
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_SPARSE_MEM);
+ dev = qdev_new(parent, "sparse-mem", TYPE_SPARSE_MEM);
qdev_prop_set_uint64(dev, "baseaddr", addr);
qdev_prop_set_uint64(dev, "length", length);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map_overlap(SYS_BUS_DEVICE(dev), 0, addr, -10000);
return &SPARSE_MEM(dev)->mmio;
}
diff --git a/include/hw/mem/sparse-mem.h b/include/hw/mem/sparse-mem.h
index f9863b154b..79c30cf412 100644
--- a/include/hw/mem/sparse-mem.h
+++ b/include/hw/mem/sparse-mem.h
@@ -14,6 +14,6 @@
#define SPARSE_MEM_H
#define TYPE_SPARSE_MEM "sparse-mem"
-MemoryRegion *sparse_mem_init(uint64_t addr, uint64_t length);
+MemoryRegion *sparse_mem_init(Object *parent, uint64_t addr, uint64_t length);
#endif
diff --git a/tests/qtest/fuzz/generic_fuzz.c b/tests/qtest/fuzz/generic_fuzz.c
index e48f868775..99b38a7fd4 100644
--- a/tests/qtest/fuzz/generic_fuzz.c
+++ b/tests/qtest/fuzz/generic_fuzz.c
@@ -788,7 +788,7 @@ static void generic_pre_fuzz(QTestState *s)
* Create a special device that we can use to back DMA buffers at very
* high memory addresses
*/
- sparse_mem_mr = sparse_mem_init(0, UINT64_MAX);
+ sparse_mem_mr = sparse_mem_init(qdev_get_machine(), 0, UINT64_MAX);
dma_regions = g_array_new(false, false, sizeof(address_range));
dma_patterns = g_array_new(false, false, sizeof(pattern));
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 030/134] hw/cxl: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (28 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 029/134] hw/mem: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 031/134] hw/hexagon: " Alexander Graf
` (104 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/cxl to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/cxl/cxl-host.c:29 | qdev_new | parent (new arg) | "cxl-fmw[*]" | Property setter machine_set_cfmw() has Object *obj = machine; thread it through as parent for each fixed memory window
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/cxl/cxl-host.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/hw/cxl/cxl-host.c b/hw/cxl/cxl-host.c
index c7a40a81f0..91ccd0d57c 100644
--- a/hw/cxl/cxl-host.c
+++ b/hw/cxl/cxl-host.c
@@ -22,11 +22,12 @@
#include "hw/pci/pcie_port.h"
#include "hw/pci-bridge/pci_expander_bridge.h"
-static void cxl_fixed_memory_window_config(CXLFixedMemoryWindowOptions *object,
+static void cxl_fixed_memory_window_config(Object *parent,
+ CXLFixedMemoryWindowOptions *object,
int index, Error **errp)
{
ERRP_GUARD();
- DeviceState *dev = qdev_new_orphan(TYPE_CXL_FMW);
+ DeviceState *dev = qdev_new(parent, "cxl-fmw[*]", TYPE_CXL_FMW);
CXLFixedWindow *fw = CXL_FMW(dev);
strList *target;
int i;
@@ -67,7 +68,7 @@ static void cxl_fixed_memory_window_config(CXLFixedMemoryWindowOptions *object,
fw->targets[i] = g_strdup(target->value);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp);
+ sysbus_realize(SYS_BUS_DEVICE(dev), errp);
}
static int cxl_fmws_link(Object *obj, void *opaque)
@@ -557,7 +558,7 @@ static void machine_set_cfmw(Object *obj, Visitor *v, const char *name,
}
for (it = cfmw_list, index = 0; it; it = it->next, index++) {
- cxl_fixed_memory_window_config(it->value, index, errp);
+ cxl_fixed_memory_window_config(obj, it->value, index, errp);
}
state->cfmw_list = cfmw_list;
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 031/134] hw/hexagon: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (29 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 030/134] hw/cxl: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 032/134] hw/xen: " Alexander Graf
` (103 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/hexagon to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/hexagon/hexagon_dsp.c:134 | qdev_new | OBJECT(machine) | "global-regs" | board init helper; collapse existing object_property_add_child()
hw/hexagon/hexagon_dsp.c:141 | qdev_new | OBJECT(machine) | "tlb" | board init helper; collapse existing object_property_add_child()
hw/hexagon/virt.c:132 | qdev_new | OBJECT(vms) | "uart" | board-init helper receives HexagonVirtMachineState*; drop const on vms
hw/hexagon/virt.c:271 | qdev_new | OBJECT(ms) | "global-regs" | board init; collapse existing object_property_add_child()
hw/hexagon/virt.c:277 | qdev_new | OBJECT(ms) | "tlb" | board init; collapse existing object_property_add_child()
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/hexagon/hexagon_dsp.c | 12 +++++-------
hw/hexagon/virt.c | 16 +++++++---------
2 files changed, 12 insertions(+), 16 deletions(-)
diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c
index 712749cda8..ccd9a06f51 100644
--- a/hw/hexagon/hexagon_dsp.c
+++ b/hw/hexagon/hexagon_dsp.c
@@ -131,18 +131,16 @@ static void hexagon_common_init(MachineState *machine, Rev_t rev,
machine->ram_size, &error_fatal);
memory_region_add_subregion(address_space, 0x0, &hms->ram);
- glob_regs_dev = qdev_new_orphan(TYPE_HEXAGON_GLOBALREG);
- object_property_add_child(OBJECT(machine), "global-regs",
- OBJECT(glob_regs_dev));
+ glob_regs_dev = qdev_new(OBJECT(machine), "global-regs",
+ TYPE_HEXAGON_GLOBALREG);
qdev_prop_set_uint64(glob_regs_dev, "config-table-addr", m_cfg->cfgbase);
qdev_prop_set_uint32(glob_regs_dev, "dsp-rev", rev);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(glob_regs_dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(glob_regs_dev), &error_fatal);
- tlb_dev = qdev_new_orphan(TYPE_HEXAGON_TLB);
- object_property_add_child(OBJECT(machine), "tlb", OBJECT(tlb_dev));
+ tlb_dev = qdev_new(OBJECT(machine), "tlb", TYPE_HEXAGON_TLB);
qdev_prop_set_uint32(tlb_dev, "num-entries",
m_cfg->cfgtable.jtlb_size_entries);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(tlb_dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(tlb_dev), &error_fatal);
for (int i = 0; i < machine->smp.cpus; i++) {
HexagonCPU *cpu = HEXAGON_CPU(object_new(machine->cpu_type));
diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c
index a7a6a8fbeb..0619f06c41 100644
--- a/hw/hexagon/virt.c
+++ b/hw/hexagon/virt.c
@@ -116,7 +116,7 @@ static int32_t fdt_add_clocks(const HexagonVirtMachineState *vms)
return clk_phandle;
}
-static void fdt_add_uart(const HexagonVirtMachineState *vms, int uart,
+static void fdt_add_uart(HexagonVirtMachineState *vms, int uart,
int32_t clk_phandle)
{
char *nodename;
@@ -129,11 +129,11 @@ static void fdt_add_uart(const HexagonVirtMachineState *vms, int uart,
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan(TYPE_PL011);
+ dev = qdev_new(OBJECT(vms), "uart", TYPE_PL011);
s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
qdev_connect_clock_in(dev, "clk", vms->apb_clk);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, base);
nodename = g_strdup_printf("/pl011@%" PRIx64, base);
@@ -268,17 +268,15 @@ static void virt_init(MachineState *ms)
&vms->parent_obj.cfgtable_rom);
fdt_add_hvx(vms, m_cfg);
- gsregs_dev = qdev_new_orphan(TYPE_HEXAGON_GLOBALREG);
- object_property_add_child(OBJECT(ms), "global-regs", OBJECT(gsregs_dev));
+ gsregs_dev = qdev_new(OBJECT(ms), "global-regs", TYPE_HEXAGON_GLOBALREG);
qdev_prop_set_uint64(gsregs_dev, "config-table-addr", m_cfg->cfgbase);
qdev_prop_set_uint32(gsregs_dev, "dsp-rev", v68_rev);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(gsregs_dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(gsregs_dev), &error_fatal);
- tlb_dev = qdev_new_orphan(TYPE_HEXAGON_TLB);
- object_property_add_child(OBJECT(ms), "tlb", OBJECT(tlb_dev));
+ tlb_dev = qdev_new(OBJECT(ms), "tlb", TYPE_HEXAGON_TLB);
qdev_prop_set_uint32(tlb_dev, "num-entries",
m_cfg->cfgtable.jtlb_size_entries);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(tlb_dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(tlb_dev), &error_fatal);
cpu0 = NULL;
for (int i = 0; i < ms->smp.cpus; i++) {
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 032/134] hw/xen: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (30 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 031/134] hw/hexagon: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 033/134] hw/display: " Alexander Graf
` (102 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/xen to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/xen/xen-bus.c:1152 | qdev_new | qdev_get_machine() | "xen-bridge" | init helper called from 3 board paths with no parent arg; use qdev_get_machine() (already used in this subsystem)
hw/xen/xen-legacy-backend.c:601 | qdev_new | qdev_get_machine() | "xen-sysdev" | init helper with no parent arg; qdev_get_machine() already used just above in xen_set_dynamic_sysbus()
hw/xen/xen-pvh-common.c:176 | sysbus_create_simple | OBJECT(s) | "virtio-mmio[*]" | board-init helper receives XenPVHMachineState *s; loop-created
hw/xen/xen-pvh-common.c:196 | qdev_new | OBJECT(s) | "tpm" | board-init helper receives XenPVHMachineState *s
hw/xen/xen_pt_graphics.c:402 | pci_create_simple | OBJECT(s) | "isa-bridge" | called from XenPCIPassthroughState realize; s is the composite passthrough device
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/xen/xen-bus.c | 5 +++--
hw/xen/xen-legacy-backend.c | 5 +++--
hw/xen/xen-pvh-common.c | 7 ++++---
hw/xen/xen_pt_graphics.c | 3 ++-
4 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/hw/xen/xen-bus.c b/hw/xen/xen-bus.c
index 746014416b..934ff33402 100644
--- a/hw/xen/xen-bus.c
+++ b/hw/xen/xen-bus.c
@@ -1149,10 +1149,11 @@ type_init(xen_register_types)
void xen_bus_init(void)
{
- DeviceState *dev = qdev_new_orphan(TYPE_XEN_BRIDGE);
+ DeviceState *dev = qdev_new(qdev_get_machine(), "xen-bridge",
+ TYPE_XEN_BRIDGE);
BusState *bus = qbus_new(TYPE_XEN_BUS, dev, NULL);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
qbus_set_bus_hotplug_handler(bus);
qemu_create_nic_bus_devices(bus, TYPE_XEN_DEVICE, "xen-net-device",
diff --git a/hw/xen/xen-legacy-backend.c b/hw/xen/xen-legacy-backend.c
index 29c90a388c..0e1da18d12 100644
--- a/hw/xen/xen-legacy-backend.c
+++ b/hw/xen/xen-legacy-backend.c
@@ -598,8 +598,9 @@ void xen_be_init(void)
exit(1);
}
- xen_sysdev = qdev_new_orphan(TYPE_XENSYSDEV);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(xen_sysdev), &error_fatal);
+ xen_sysdev = qdev_new(qdev_get_machine(), "xen-sysdev",
+ TYPE_XENSYSDEV);
+ sysbus_realize(SYS_BUS_DEVICE(xen_sysdev), &error_fatal);
xen_sysbus = qbus_new(TYPE_XENSYSBUS, xen_sysdev, "xen-sysbus");
qbus_set_bus_hotplug_handler(xen_sysbus);
diff --git a/hw/xen/xen-pvh-common.c b/hw/xen/xen-pvh-common.c
index 17f545d07c..dae523f723 100644
--- a/hw/xen/xen-pvh-common.c
+++ b/hw/xen/xen-pvh-common.c
@@ -173,7 +173,8 @@ static void xen_create_virtio_mmio_devices(XenPVHMachineState *s)
qemu_irq irq = qemu_allocate_irq(xen_set_irq, NULL,
s->cfg.virtio_mmio_irq_base + i);
- sysbus_create_simple_orphan("virtio-mmio", base, irq);
+ sysbus_create_simple(OBJECT(s), "virtio-mmio[*]", "virtio-mmio",
+ base, irq);
trace_xen_create_virtio_mmio_devices(i,
s->cfg.virtio_mmio_irq_base + i,
@@ -193,7 +194,7 @@ static void xen_enable_tpm(XenPVHMachineState *s)
error_report("Couldn't find tmp0 backend");
return;
}
- dev = qdev_new_orphan(TYPE_TPM_TIS_SYSBUS);
+ dev = qdev_new(OBJECT(s), "tpm", TYPE_TPM_TIS_SYSBUS);
/*
* FIXME This use of &err is is wrong. If both calls fail, the
* second will trip error_setv()'s assertion. If just one call
@@ -204,7 +205,7 @@ static void xen_enable_tpm(XenPVHMachineState *s)
object_property_set_link(OBJECT(dev), "tpmdev", OBJECT(be), &err);
object_property_set_str(OBJECT(dev), "tpmdev", be->id, &err);
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, s->cfg.tpm.base);
trace_xen_enable_tpm(s->cfg.tpm.base);
diff --git a/hw/xen/xen_pt_graphics.c b/hw/xen/xen_pt_graphics.c
index 4457209e83..2841b45ca1 100644
--- a/hw/xen/xen_pt_graphics.c
+++ b/hw/xen/xen_pt_graphics.c
@@ -399,7 +399,8 @@ void xen_igd_passthrough_isa_bridge_create(XenPCIPassthroughState *s,
}
/* Currently IGD drivers always need to access PCH by 1f.0. */
- bridge_dev = pci_create_simple_orphan(bus, PCI_DEVFN(0x1f, 0),
+ bridge_dev = pci_create_simple(OBJECT(s), "isa-bridge", bus,
+ PCI_DEVFN(0x1f, 0),
"igd-passthrough-isa-bridge");
/*
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 033/134] hw/display: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (31 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 032/134] hw/xen: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-13 8:32 ` Philippe Mathieu-Daudé
2026-07-11 22:35 ` [RFC PATCH 034/134] hw/nvram: " Alexander Graf
` (101 subsequent siblings)
134 siblings, 1 reply; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/display to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/display/sii9022.c:167 | i2c_slave_create_simple | OBJECT(dev) | "ddc" | DeviceClass.realize(); DDC slave owned by sii9022 device
hw/display/sm501.c:1913 | qdev_new | OBJECT(dev) | "ddc" | sm501_init() helper receives realizing DeviceState *dev; drop _and_unref
hw/display/xlnx_dp.c:1349 | qdev_new | obj | "dpcd" | instance_init(Object *obj); collapse existing add_child+unref, keep name
hw/display/xlnx_dp.c:1353 | qdev_new | obj | "edid" | instance_init(Object *obj); collapse existing add_child+unref, keep name
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/display/sii9022.c | 2 +-
hw/display/sm501.c | 4 ++--
hw/display/xlnx_dp.c | 14 +++-----------
3 files changed, 6 insertions(+), 14 deletions(-)
diff --git a/hw/display/sii9022.c b/hw/display/sii9022.c
index 0bf49195d7..2accebf193 100644
--- a/hw/display/sii9022.c
+++ b/hw/display/sii9022.c
@@ -164,7 +164,7 @@ static void sii9022_realize(DeviceState *dev, Error **errp)
I2CBus *bus;
bus = I2C_BUS(qdev_get_parent_bus(dev));
- i2c_slave_create_simple_orphan(bus, TYPE_I2CDDC, 0x50);
+ i2c_slave_create_simple(OBJECT(dev), "ddc", bus, TYPE_I2CDDC, 0x50);
}
static void sii9022_class_init(ObjectClass *klass, const void *data)
diff --git a/hw/display/sm501.c b/hw/display/sm501.c
index d4b0ed048c..81c27c8f52 100644
--- a/hw/display/sm501.c
+++ b/hw/display/sm501.c
@@ -1910,9 +1910,9 @@ static void sm501_init(SM501State *s, DeviceState *dev,
/* i2c */
s->i2c_bus = i2c_init_bus(dev, "sm501.i2c");
/* ddc */
- I2CDDCState *ddc = I2CDDC(qdev_new_orphan(TYPE_I2CDDC));
+ I2CDDCState *ddc = I2CDDC(qdev_new(OBJECT(dev), "ddc", TYPE_I2CDDC));
i2c_slave_set_address(I2C_SLAVE(ddc), 0x50);
- qdev_realize_and_unref(DEVICE(ddc), BUS(s->i2c_bus), &error_abort);
+ qdev_realize(DEVICE(ddc), BUS(s->i2c_bus), &error_abort);
/* mmio */
memory_region_init(&s->mmio_region, OBJECT(dev), "sm501.mmio", MMIO_SIZE);
diff --git a/hw/display/xlnx_dp.c b/hw/display/xlnx_dp.c
index e8490d644d..5968466e79 100644
--- a/hw/display/xlnx_dp.c
+++ b/hw/display/xlnx_dp.c
@@ -1341,19 +1341,11 @@ static void xlnx_dp_init(Object *obj)
*/
s->aux_bus = aux_bus_init(DEVICE(obj), "aux");
- /*
- * Initialize DPCD and EDID. Once we have added the objects as
- * child properties of this device, we can drop the reference we
- * hold to them, leaving the child-property as the only reference.
- */
- s->dpcd = DPCD(qdev_new_orphan("dpcd"));
- object_property_add_child(OBJECT(s), "dpcd", OBJECT(s->dpcd));
- object_unref(s->dpcd);
+ /* Initialize DPCD and EDID. */
+ s->dpcd = DPCD(qdev_new(obj, "dpcd", "dpcd"));
- s->edid = I2CDDC(qdev_new_orphan("i2c-ddc"));
+ s->edid = I2CDDC(qdev_new(obj, "edid", "i2c-ddc"));
i2c_slave_set_address(I2C_SLAVE(s->edid), 0x50);
- object_property_add_child(OBJECT(s), "edid", OBJECT(s->edid));
- object_unref(s->edid);
fifo8_create(&s->rx_fifo, 16);
fifo8_create(&s->tx_fifo, 16);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 033/134] hw/display: Give onboard devices a QOM parent
2026-07-11 22:35 ` [RFC PATCH 033/134] hw/display: " Alexander Graf
@ 2026-07-13 8:32 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 156+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-07-13 8:32 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
On 12/7/26 00:35, Alexander Graf wrote:
> Convert the *_orphan() device-creation calls in hw/display to the new
> parented API introduced earlier in this series, so every onboard
> device gets a stable path in the composition tree instead of landing
> in /machine/unattached with an unstable device[N] name.
>
> The parent for each device is the object that owns its lifetime: the
> machine for board-created devices, the containing device for
> composite children. Names follow existing QOM conventions.
>
> Per-site rationale (reviewers: dispute the modeling here):
>
> hw/display/sii9022.c:167 | i2c_slave_create_simple | OBJECT(dev) | "ddc" | DeviceClass.realize(); DDC slave owned by sii9022 device
> hw/display/sm501.c:1913 | qdev_new | OBJECT(dev) | "ddc" | sm501_init() helper receives realizing DeviceState *dev; drop _and_unref
> hw/display/xlnx_dp.c:1349 | qdev_new | obj | "dpcd" | instance_init(Object *obj); collapse existing add_child+unref, keep name
> hw/display/xlnx_dp.c:1353 | qdev_new | obj | "edid" | instance_init(Object *obj); collapse existing add_child+unref, keep name
>
> Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> hw/display/sii9022.c | 2 +-
> hw/display/sm501.c | 4 ++--
> hw/display/xlnx_dp.c | 14 +++-----------
> 3 files changed, 6 insertions(+), 14 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 034/134] hw/nvram: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (32 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 033/134] hw/display: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 035/134] hw/dma: " Alexander Graf
` (100 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/nvram to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/nvram/eeprom_at24c.c:151 | i2c_slave_new | ORPHAN-JUSTIFIED | - | public helper with ~80 callers in hw/arm board files; parent threading deferred to per-board conversion to keep patch scoped to hw/nvram
hw/nvram/fw_cfg.c:1032 | qdev_new | OBJECT(qdev_get_machine()) | TYPE_FW_CFG | collapse existing add_child(machine, TYPE_FW_CFG, dev); drop _and_unref
hw/nvram/fw_cfg.c:1064 | qdev_new | OBJECT(qdev_get_machine()) | TYPE_FW_CFG | collapse existing add_child(machine, TYPE_FW_CFG, dev); drop _and_unref
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/nvram/fw_cfg.c | 16 ++++++----------
1 file changed, 6 insertions(+), 10 deletions(-)
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index 01fba1c6f6..d3f055718c 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -1029,13 +1029,11 @@ FWCfgState *fw_cfg_init_io_dma(uint32_t iobase, AddressSpace *dma_as)
assert(dma_as);
- dev = qdev_new_orphan(TYPE_FW_CFG_IO);
-
- object_property_add_child(OBJECT(qdev_get_machine()), TYPE_FW_CFG,
- OBJECT(dev));
+ dev = qdev_new(OBJECT(qdev_get_machine()), TYPE_FW_CFG,
+ TYPE_FW_CFG_IO);
sbd = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
ios = FW_CFG_IO(dev);
memory_region_add_subregion(iomem, iobase, &ios->comb_iomem);
@@ -1061,17 +1059,15 @@ static FWCfgState *fw_cfg_init_mem_internal(hwaddr ctl_addr,
FWCfgState *s;
bool dma_requested = dma_addr && dma_as;
- dev = qdev_new_orphan(TYPE_FW_CFG_MEM);
+ dev = qdev_new(OBJECT(qdev_get_machine()), TYPE_FW_CFG,
+ TYPE_FW_CFG_MEM);
qdev_prop_set_uint32(dev, "data_width", data_width);
if (!dma_requested) {
qdev_prop_set_bit(dev, "dma_enabled", false);
}
- object_property_add_child(OBJECT(qdev_get_machine()), TYPE_FW_CFG,
- OBJECT(dev));
-
sbd = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
sysbus_mmio_map(sbd, 0, ctl_addr);
sysbus_mmio_map(sbd, 1, data_addr);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 035/134] hw/dma: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (33 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 034/134] hw/nvram: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 036/134] hw/misc: " Alexander Graf
` (99 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/dma to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/dma/i8257.c:654 | isa_new | parent | "dma[*]" | helper already receives Object *parent; collapse existing add_child, keep name; drop _and_unref
hw/dma/i8257.c:663 | isa_new | parent | "dma[*]" | helper already receives Object *parent; collapse existing add_child, keep name; drop _and_unref
hw/dma/rc4030.c:750 | qdev_new | parent | "rc4030" | thread Object *parent from single caller mips_jazz_init(machine); update header + caller; drop _and_unref
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/dma/i8257.c | 10 ++++------
hw/dma/rc4030.c | 7 ++++---
hw/mips/jazz.c | 2 +-
include/hw/mips/mips.h | 3 ++-
4 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/hw/dma/i8257.c b/hw/dma/i8257.c
index d1ab17b80d..735d7ca9a7 100644
--- a/hw/dma/i8257.c
+++ b/hw/dma/i8257.c
@@ -651,23 +651,21 @@ void i8257_dma_init(Object *parent, ISABus *bus, bool high_page_enable)
ISADevice *isa1, *isa2;
DeviceState *d;
- isa1 = isa_new_orphan(TYPE_I8257);
- object_property_add_child(parent, "dma[*]", OBJECT(isa1));
+ isa1 = isa_new(parent, "dma[*]", TYPE_I8257);
d = DEVICE(isa1);
qdev_prop_set_int32(d, "base", 0x00);
qdev_prop_set_int32(d, "page-base", 0x80);
qdev_prop_set_int32(d, "pageh-base", high_page_enable ? 0x480 : -1);
qdev_prop_set_int32(d, "dshift", 0);
- isa_realize_and_unref(isa1, bus, &error_fatal);
+ qdev_realize(d, BUS(bus), &error_fatal);
- isa2 = isa_new_orphan(TYPE_I8257);
- object_property_add_child(parent, "dma[*]", OBJECT(isa2));
+ isa2 = isa_new(parent, "dma[*]", TYPE_I8257);
d = DEVICE(isa2);
qdev_prop_set_int32(d, "base", 0xc0);
qdev_prop_set_int32(d, "page-base", 0x88);
qdev_prop_set_int32(d, "pageh-base", high_page_enable ? 0x488 : -1);
qdev_prop_set_int32(d, "dshift", 1);
- isa_realize_and_unref(isa2, bus, &error_fatal);
+ qdev_realize(d, BUS(bus), &error_fatal);
isa_bus_dma(bus, ISADMA(isa1), ISADMA(isa2));
}
diff --git a/hw/dma/rc4030.c b/hw/dma/rc4030.c
index ab8aaf7da4..800cdfb42d 100644
--- a/hw/dma/rc4030.c
+++ b/hw/dma/rc4030.c
@@ -743,12 +743,13 @@ static void rc4030_register_types(void)
type_init(rc4030_register_types)
-DeviceState *rc4030_init(rc4030_dma **dmas, IOMMUMemoryRegion **dma_mr)
+DeviceState *rc4030_init(Object *parent, rc4030_dma **dmas,
+ IOMMUMemoryRegion **dma_mr)
{
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_RC4030);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(parent, "rc4030", TYPE_RC4030);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
*dmas = rc4030_allocate_dmas(dev, 4);
*dma_mr = &RC4030(dev)->dma_mr;
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index 5e34a6582d..62f2350d36 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -261,7 +261,7 @@ static void mips_jazz_init(MachineState *machine,
cpu_mips_clock_init(cpu);
/* Chipset */
- rc4030 = rc4030_init(&dmas, &rc4030_dma_mr);
+ rc4030 = rc4030_init(OBJECT(machine), &dmas, &rc4030_dma_mr);
sysbus = SYS_BUS_DEVICE(rc4030);
sysbus_connect_irq(sysbus, 0, env->irq[6]);
sysbus_connect_irq(sysbus, 1, env->irq[3]);
diff --git a/include/hw/mips/mips.h b/include/hw/mips/mips.h
index cd0ccb4e5d..7fa32eab38 100644
--- a/include/hw/mips/mips.h
+++ b/include/hw/mips/mips.h
@@ -17,6 +17,7 @@ typedef struct rc4030DMAState *rc4030_dma;
void rc4030_dma_read(void *dma, uint8_t *buf, int len);
void rc4030_dma_write(void *dma, uint8_t *buf, int len);
-DeviceState *rc4030_init(rc4030_dma **dmas, IOMMUMemoryRegion **dma_mr);
+DeviceState *rc4030_init(Object *parent, rc4030_dma **dmas,
+ IOMMUMemoryRegion **dma_mr);
#endif
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 036/134] hw/misc: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (34 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 035/134] hw/dma: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 037/134] hw/scsi: " Alexander Graf
` (98 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/misc to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/misc/empty_slot.c:61 | qdev_new | parent | name | thread Object *parent as first arg; use existing name arg as child name; 7 callers updated (m68k next-cube, sparc sun4m, gt64120 realize)
hw/misc/led.c:144 | qdev_new | parentobj | name | already receives parentobj; collapse existing object_property_add_child(); compute name before create
hw/misc/sifive_e_prci.c:120 | qdev_new | parent | "prci" | thread Object *parent as first arg; single caller in sifive_e_soc_realize passes OBJECT(dev)
hw/misc/sifive_test.c:100 | qdev_new | parent | "test" | thread Object *parent as first arg; 2 callers (riscv virt, or1k virt) pass machine-state
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/m68k/next-cube.c | 6 +++---
hw/misc/empty_slot.c | 7 ++++---
hw/misc/led.c | 15 ++++++++-------
hw/misc/sifive_e_prci.c | 6 +++---
hw/misc/sifive_test.c | 6 +++---
hw/or1k/virt.c | 2 +-
hw/pci-host/gt64120.c | 2 +-
hw/riscv/sifive_e.c | 2 +-
hw/riscv/virt.c | 2 +-
hw/sparc/sun4m.c | 7 ++++---
include/hw/misc/empty_slot.h | 3 ++-
include/hw/misc/sifive_e_prci.h | 2 +-
include/hw/misc/sifive_test.h | 2 +-
13 files changed, 33 insertions(+), 29 deletions(-)
diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c
index d97168d9f3..530dc1ab59 100644
--- a/hw/m68k/next-cube.c
+++ b/hw/m68k/next-cube.c
@@ -1292,9 +1292,9 @@ static void next_cube_init(MachineState *machine)
sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 1, 0x02106000);
/* unknown: Brightness control register? */
- empty_slot_init("next.unknown.0", 0x02110000, 0x10);
+ empty_slot_init(OBJECT(machine), "next.unknown.0", 0x02110000, 0x10);
/* unknown: Magneto-Optical drive controller? */
- empty_slot_init("next.unknown.1", 0x02112000, 0x10);
+ empty_slot_init(OBJECT(machine), "next.unknown.1", 0x02112000, 0x10);
/* SCSI */
sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 2, 0x02114000);
@@ -1304,7 +1304,7 @@ static void next_cube_init(MachineState *machine)
sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 4, 0x02118000);
/* unknown: Serial clock configuration register? */
- empty_slot_init("next.unknown.2", 0x02118004, 0x10);
+ empty_slot_init(OBJECT(machine), "next.unknown.2", 0x02118004, 0x10);
/* Timer */
sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 5, 0x0211a000);
diff --git a/hw/misc/empty_slot.c b/hw/misc/empty_slot.c
index 182211fdcc..64764dfd92 100644
--- a/hw/misc/empty_slot.c
+++ b/hw/misc/empty_slot.c
@@ -52,16 +52,17 @@ static const MemoryRegionOps empty_slot_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
-void empty_slot_init(const char *name, hwaddr addr, uint64_t slot_size)
+void empty_slot_init(Object *parent, const char *name, hwaddr addr,
+ uint64_t slot_size)
{
if (slot_size > 0) {
/* Only empty slots larger than 0 byte need handling. */
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_EMPTY_SLOT);
+ dev = qdev_new(parent, name, TYPE_EMPTY_SLOT);
qdev_prop_set_uint64(dev, "size", slot_size);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map_overlap(SYS_BUS_DEVICE(dev), 0, addr, -10000);
}
diff --git a/hw/misc/led.c b/hw/misc/led.c
index 620284063b..bed85ec3c6 100644
--- a/hw/misc/led.c
+++ b/hw/misc/led.c
@@ -141,20 +141,21 @@ LEDState *led_create_simple(Object *parentobj,
g_autofree char *name = NULL;
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_LED);
- qdev_prop_set_bit(dev, "gpio-active-high",
- gpio_polarity == GPIO_POLARITY_ACTIVE_HIGH);
- qdev_prop_set_string(dev, "color", led_color_name[color]);
if (!description) {
static unsigned undescribed_led_id;
name = g_strdup_printf("undescribed-led-#%u", undescribed_led_id++);
} else {
- qdev_prop_set_string(dev, "description", description);
name = g_ascii_strdown(description, -1);
name = g_strdelimit(name, " #", '-');
}
- object_property_add_child(parentobj, name, OBJECT(dev));
- qdev_realize_and_unref(dev, NULL, &error_fatal);
+ dev = qdev_new(parentobj, name, TYPE_LED);
+ qdev_prop_set_bit(dev, "gpio-active-high",
+ gpio_polarity == GPIO_POLARITY_ACTIVE_HIGH);
+ qdev_prop_set_string(dev, "color", led_color_name[color]);
+ if (description) {
+ qdev_prop_set_string(dev, "description", description);
+ }
+ qdev_realize(dev, NULL, &error_fatal);
return LED(dev);
}
diff --git a/hw/misc/sifive_e_prci.c b/hw/misc/sifive_e_prci.c
index 7ac5db5933..a466d37735 100644
--- a/hw/misc/sifive_e_prci.c
+++ b/hw/misc/sifive_e_prci.c
@@ -115,10 +115,10 @@ type_init(sifive_e_prci_register_types)
/*
* Create PRCI device.
*/
-DeviceState *sifive_e_prci_create(hwaddr addr)
+DeviceState *sifive_e_prci_create(Object *parent, hwaddr addr)
{
- DeviceState *dev = qdev_new_orphan(TYPE_SIFIVE_E_PRCI);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ DeviceState *dev = qdev_new(parent, "prci", TYPE_SIFIVE_E_PRCI);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
return dev;
}
diff --git a/hw/misc/sifive_test.c b/hw/misc/sifive_test.c
index f861858d9b..81ae00a110 100644
--- a/hw/misc/sifive_test.c
+++ b/hw/misc/sifive_test.c
@@ -95,10 +95,10 @@ type_init(sifive_test_register_types)
/*
* Create Test device.
*/
-DeviceState *sifive_test_create(hwaddr addr)
+DeviceState *sifive_test_create(Object *parent, hwaddr addr)
{
- DeviceState *dev = qdev_new_orphan(TYPE_SIFIVE_TEST);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ DeviceState *dev = qdev_new(parent, "test", TYPE_SIFIVE_TEST);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
return dev;
}
diff --git a/hw/or1k/virt.c b/hw/or1k/virt.c
index 7362433a02..276be32648 100644
--- a/hw/or1k/virt.c
+++ b/hw/or1k/virt.c
@@ -264,7 +264,7 @@ static void openrisc_virt_test_init(OR1KVirtState *state, hwaddr base,
char *nodename;
/* SiFive Test MMIO device */
- sifive_test_create(base);
+ sifive_test_create(OBJECT(state), base);
/* SiFive Test MMIO Reset device FDT */
nodename = g_strdup_printf("/soc/test@%" HWADDR_PRIx, base);
diff --git a/hw/pci-host/gt64120.c b/hw/pci-host/gt64120.c
index 780c86cd9a..0c49e51ad0 100644
--- a/hw/pci-host/gt64120.c
+++ b/hw/pci-host/gt64120.c
@@ -1224,7 +1224,7 @@ static void gt64120_realize(DeviceState *dev, Error **errp)
* exception when accessing invalid memory. Create an empty slot to
* emulate this feature.
*/
- empty_slot_init("GT64120", 0, 0x20000000);
+ empty_slot_init(OBJECT(dev), "GT64120", 0, 0x20000000);
}
static void gt64120_pci_realize(PCIDevice *d, Error **errp)
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
index dfdb7ae4c1..d07edde237 100644
--- a/hw/riscv/sifive_e.c
+++ b/hw/riscv/sifive_e.c
@@ -233,7 +233,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
SIFIVE_E_LFCLK_DEFAULT_FREQ, false);
- sifive_e_prci_create(memmap[SIFIVE_E_DEV_PRCI].base);
+ sifive_e_prci_create(OBJECT(dev), memmap[SIFIVE_E_DEV_PRCI].base);
/* AON */
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index 3ceb476b84..d7ce57069a 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -1477,7 +1477,7 @@ static void virt_machine_init(MachineState *machine)
rom_set_fw(s->fw_cfg);
/* SiFive Test MMIO device */
- sifive_test_create(s->memmap[VIRT_TEST].base);
+ sifive_test_create(OBJECT(machine), s->memmap[VIRT_TEST].base);
/* VirtIO MMIO devices */
for (i = 0; i < VIRTIO_COUNT; i++) {
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 80e37555b1..52627dbdec 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -842,7 +842,7 @@ static void sun4m_hw_init(MachineState *machine)
/* models without ECC don't trap when missing ram is accessed */
if (!hwdef->ecc_base) {
- empty_slot_init("ecc", machine->ram_size,
+ empty_slot_init(OBJECT(machine), "ecc", machine->ram_size,
hwdef->max_mem - machine->ram_size);
}
@@ -875,7 +875,7 @@ static void sun4m_hw_init(MachineState *machine)
Software shouldn't use aliased addresses, neither should it crash
when does. Using empty_slot instead of aliasing can help with
debugging such accesses */
- empty_slot_init("iommu.alias",
+ empty_slot_init(OBJECT(machine), "iommu.alias",
hwdef->iommu_pad_base, hwdef->iommu_pad_len);
}
@@ -937,7 +937,8 @@ static void sun4m_hw_init(MachineState *machine)
/* vsimm registers probed by OBP */
if (hwdef->vsimm[i].reg_base) {
char *name = g_strdup_printf("vsimm[%d]", i);
- empty_slot_init(name, hwdef->vsimm[i].reg_base, 0x2000);
+ empty_slot_init(OBJECT(machine), name,
+ hwdef->vsimm[i].reg_base, 0x2000);
g_free(name);
}
}
diff --git a/include/hw/misc/empty_slot.h b/include/hw/misc/empty_slot.h
index dec56e56ae..12f03aa16a 100644
--- a/include/hw/misc/empty_slot.h
+++ b/include/hw/misc/empty_slot.h
@@ -14,6 +14,7 @@
#include "exec/hwaddr.h"
-void empty_slot_init(const char *name, hwaddr addr, uint64_t slot_size);
+void empty_slot_init(Object *parent, const char *name, hwaddr addr,
+ uint64_t slot_size);
#endif
diff --git a/include/hw/misc/sifive_e_prci.h b/include/hw/misc/sifive_e_prci.h
index d0abd59f4b..6221e95d36 100644
--- a/include/hw/misc/sifive_e_prci.h
+++ b/include/hw/misc/sifive_e_prci.h
@@ -69,6 +69,6 @@ struct SiFiveEPRCIState {
uint32_t plloutdiv;
};
-DeviceState *sifive_e_prci_create(hwaddr addr);
+DeviceState *sifive_e_prci_create(Object *parent, hwaddr addr);
#endif
diff --git a/include/hw/misc/sifive_test.h b/include/hw/misc/sifive_test.h
index 85afd35263..fd079cfd4c 100644
--- a/include/hw/misc/sifive_test.h
+++ b/include/hw/misc/sifive_test.h
@@ -42,6 +42,6 @@ enum {
FINISHER_RESET = 0x7777
};
-DeviceState *sifive_test_create(hwaddr addr);
+DeviceState *sifive_test_create(Object *parent, hwaddr addr);
#endif
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 037/134] hw/scsi: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (35 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 036/134] hw/misc: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 038/134] hw/net: " Alexander Graf
` (97 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/scsi to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/scsi/lasi_ncr710.c:234 | qdev_new | parent | "scsi" | thread Object *parent as first arg; single caller in hw/hppa/machine.c board init passes OBJECT(machine)
hw/scsi/ncr53c710.c:2379 | qdev_new | parent | "scsi" | thread Object *parent as first arg; no in-tree callers, header updated
hw/scsi/ncr53c710.c:2397 | qdev_new | parent | "scsi" | thread Object *parent as first arg; no in-tree callers, header updated
hw/scsi/scsi-bus.c:448 | qdev_new | OBJECT(bus) | name | collapse existing object_property_add_child(OBJECT(bus), name, dev); keep dynamic legacy[%d] name
hw/scsi/spapr_vscsi.c:1238 | qdev_new | parent | "vscsi[*]" | thread Object *parent as first arg; single caller in hw/ppc/spapr.c board init loop passes OBJECT(spapr)
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/hppa/machine.c | 2 +-
hw/ppc/spapr.c | 2 +-
hw/scsi/lasi_ncr710.c | 8 ++++----
hw/scsi/lasi_ncr710.h | 4 ++--
hw/scsi/ncr53c710.c | 15 ++++++++-------
hw/scsi/ncr53c710.h | 7 ++++---
hw/scsi/scsi-bus.c | 5 ++---
hw/scsi/spapr_vscsi.c | 6 +++---
include/hw/ppc/spapr_vio.h | 2 +-
9 files changed, 26 insertions(+), 25 deletions(-)
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index e50f9adf41..e3c9053bf2 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -631,7 +631,7 @@ static void machine_HP_715_init(MachineState *machine)
1));
/* SCSI disk setup. */
if (drive_get_max_bus(IF_SCSI) >= 0) {
- dev = lasi_ncr710_init(addr_space,
+ dev = lasi_ncr710_init(OBJECT(machine), addr_space,
translate(NULL, LASI_HPA_715 + 0x6000),
qdev_get_gpio_in(lasi_dev, LASI_IRQ_SCSI_HPA));
assert(dev);
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index e09b529ebc..91f9d873b8 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -3062,7 +3062,7 @@ static void spapr_machine_init(MachineState *machine)
pci_init_nic_devices(phb->bus, NULL);
for (i = 0; i <= drive_get_max_bus(IF_SCSI); i++) {
- spapr_vscsi_create(spapr->vio_bus);
+ spapr_vscsi_create(OBJECT(spapr), spapr->vio_bus);
}
/* Graphics */
diff --git a/hw/scsi/lasi_ncr710.c b/hw/scsi/lasi_ncr710.c
index e1a1f68aaa..d40bc62157 100644
--- a/hw/scsi/lasi_ncr710.c
+++ b/hw/scsi/lasi_ncr710.c
@@ -224,18 +224,18 @@ void lasi_ncr710_handle_legacy_cmdline(DeviceState *lasi_dev)
}
}
-DeviceState *lasi_ncr710_init(MemoryRegion *addr_space, hwaddr hpa,
- qemu_irq irq)
+DeviceState *lasi_ncr710_init(Object *parent, MemoryRegion *addr_space,
+ hwaddr hpa, qemu_irq irq)
{
DeviceState *dev;
LasiNCR710State *s;
SysBusDevice *sbd;
- dev = qdev_new_orphan(TYPE_LASI_NCR710);
+ dev = qdev_new(parent, "scsi", TYPE_LASI_NCR710);
s = LASI_NCR710(dev);
sbd = SYS_BUS_DEVICE(dev);
s->lasi_irq = irq;
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
memory_region_add_subregion(addr_space, hpa,
sysbus_mmio_get_region(sbd, 0));
return dev;
diff --git a/hw/scsi/lasi_ncr710.h b/hw/scsi/lasi_ncr710.h
index 450fb7e1c3..e963a6511f 100644
--- a/hw/scsi/lasi_ncr710.h
+++ b/hw/scsi/lasi_ncr710.h
@@ -48,8 +48,8 @@ typedef struct LasiNCR710State {
NCR710State ncr710;
} LasiNCR710State;
-DeviceState *lasi_ncr710_init(MemoryRegion *addr_space, hwaddr hpa,
- qemu_irq irq);
+DeviceState *lasi_ncr710_init(Object *parent, MemoryRegion *addr_space,
+ hwaddr hpa, qemu_irq irq);
void lasi_ncr710_handle_legacy_cmdline(DeviceState *lasi_dev);
#endif
diff --git a/hw/scsi/ncr53c710.c b/hw/scsi/ncr53c710.c
index 54ce2df641..633a76c70b 100644
--- a/hw/scsi/ncr53c710.c
+++ b/hw/scsi/ncr53c710.c
@@ -2371,22 +2371,23 @@ static const VMStateDescription vmstate_sysbus_ncr710 = {
}
};
-DeviceState *ncr710_device_create_sysbus(hwaddr addr, qemu_irq irq)
+DeviceState *ncr710_device_create_sysbus(Object *parent, hwaddr addr,
+ qemu_irq irq)
{
DeviceState *dev;
SysBusDevice *sysbus;
- dev = qdev_new_orphan(TYPE_SYSBUS_NCR710_SCSI);
+ dev = qdev_new(parent, "scsi", TYPE_SYSBUS_NCR710_SCSI);
sysbus = SYS_BUS_DEVICE(dev);
- qdev_realize_and_unref(dev, NULL, &error_abort);
+ qdev_realize(dev, NULL, &error_abort);
sysbus_mmio_map(sysbus, 0, addr);
sysbus_connect_irq(sysbus, 0, irq);
return dev;
}
-DeviceState *ncr53c710_init(MemoryRegion *address_space, hwaddr addr,
- qemu_irq irq)
+DeviceState *ncr53c710_init(Object *parent, MemoryRegion *address_space,
+ hwaddr addr, qemu_irq irq)
{
DeviceState *dev;
SysBusDevice *sysbus;
@@ -2394,10 +2395,10 @@ DeviceState *ncr53c710_init(MemoryRegion *address_space, hwaddr addr,
/* trace_ncr710_device_init(addr); */
- dev = qdev_new_orphan(TYPE_SYSBUS_NCR710_SCSI);
+ dev = qdev_new(parent, "scsi", TYPE_SYSBUS_NCR710_SCSI);
sysbus = SYS_BUS_DEVICE(dev);
- qdev_realize_and_unref(dev, NULL, &error_abort);
+ qdev_realize(dev, NULL, &error_abort);
sysbus_mmio_map(sysbus, 0, addr);
sysbus_connect_irq(sysbus, 0, irq);
diff --git a/hw/scsi/ncr53c710.h b/hw/scsi/ncr53c710.h
index 00b6a01577..6e466d6a36 100644
--- a/hw/scsi/ncr53c710.h
+++ b/hw/scsi/ncr53c710.h
@@ -229,9 +229,10 @@ static inline SysBusNCR710State *sysbus_from_ncr710(NCR710State *s)
return container_of(s, SysBusNCR710State, ncr710);
}
-DeviceState *ncr53c710_init(MemoryRegion *address_space, hwaddr addr,
- qemu_irq irq);
-DeviceState *ncr710_device_create_sysbus(hwaddr addr, qemu_irq irq);
+DeviceState *ncr53c710_init(Object *parent, MemoryRegion *address_space,
+ hwaddr addr, qemu_irq irq);
+DeviceState *ncr710_device_create_sysbus(Object *parent, hwaddr addr,
+ qemu_irq irq);
void ncr710_reg_write(void *opaque, hwaddr addr, uint64_t val, unsigned size);
uint64_t ncr710_reg_read(void *opaque, hwaddr addr, unsigned size);
void ncr710_soft_reset(NCR710State *s);
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index 806a20baee..bc7cfea6ed 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -445,9 +445,8 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
driver = "scsi-hd";
}
}
- dev = qdev_new_orphan(driver);
name = g_strdup_printf("legacy[%d]", unit);
- object_property_add_child(OBJECT(bus), name, OBJECT(dev));
+ dev = qdev_new(OBJECT(bus), name, driver);
g_free(name);
s = SCSI_DEVICE(dev);
@@ -473,7 +472,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
return NULL;
}
- if (!qdev_realize_and_unref(dev, &bus->qbus, errp)) {
+ if (!qdev_realize(dev, &bus->qbus, errp)) {
object_unparent(OBJECT(dev));
return NULL;
}
diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c
index 492d7d18a2..95cd21ffbb 100644
--- a/hw/scsi/spapr_vscsi.c
+++ b/hw/scsi/spapr_vscsi.c
@@ -1231,13 +1231,13 @@ static void spapr_vscsi_realize(SpaprVioDevice *dev, Error **errp)
qbus_set_hotplug_handler(BUS(&s->bus), NULL);
}
-void spapr_vscsi_create(SpaprVioBus *bus)
+void spapr_vscsi_create(Object *parent, SpaprVioBus *bus)
{
DeviceState *dev;
- dev = qdev_new_orphan("spapr-vscsi");
+ dev = qdev_new(parent, "vscsi[*]", "spapr-vscsi");
- qdev_realize_and_unref(dev, &bus->bus, &error_fatal);
+ qdev_realize(dev, &bus->bus, &error_fatal);
scsi_bus_legacy_handle_cmdline(&VIO_SPAPR_VSCSI_DEVICE(dev)->bus);
}
diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h
index 0ea0dbae8b..72baef6919 100644
--- a/include/hw/ppc/spapr_vio.h
+++ b/include/hw/ppc/spapr_vio.h
@@ -139,7 +139,7 @@ SpaprVioDevice *vty_lookup(SpaprMachineState *spapr, target_ulong reg);
void vty_putchars(SpaprVioDevice *sdev, uint8_t *buf, int len);
void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev);
void spapr_vlan_create(SpaprVioBus *bus, NICInfo *nd);
-void spapr_vscsi_create(SpaprVioBus *bus);
+void spapr_vscsi_create(Object *parent, SpaprVioBus *bus);
SpaprVioDevice *spapr_vty_get_default(SpaprVioBus *bus);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 038/134] hw/net: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (36 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 037/134] hw/scsi: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 039/134] hw/ide: " Alexander Graf
` (96 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/net to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/net/lan9118.c:1342 | qdev_new | parent | "eth" | thread Object *parent as first arg; 5 board-init callers pass OBJECT(machine)
hw/net/smc91c111.c:957 | qdev_new | parent | "eth" | thread Object *parent as first arg; 3 board-init callers pass OBJECT(machine)
hw/net/spapr_llan.c:374 | qdev_new | parent | "vlan[*]" | thread Object *parent as first arg; single caller in hw/ppc/spapr.c board-init loop passes OBJECT(spapr)
hw/net/xen_nic.c:622 | qdev_new | ORPHAN-JUSTIFIED | - | XenBackendOps.create hotplug callback driven by xenstore watch; dynamic device with no board owner (same pattern as xen-block/xen_console)
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/integratorcp.c | 2 +-
hw/arm/kzm.c | 2 +-
hw/arm/mps2.c | 2 +-
hw/arm/mps3r.c | 2 +-
hw/arm/realview.c | 4 ++--
hw/arm/versatilepb.c | 2 +-
hw/arm/vexpress.c | 2 +-
hw/net/lan9118.c | 6 +++---
hw/net/smc91c111.c | 6 +++---
hw/net/spapr_llan.c | 6 +++---
hw/ppc/spapr.c | 2 +-
include/hw/net/lan9118.h | 2 +-
include/hw/net/smc91c111.h | 2 +-
include/hw/ppc/spapr_vio.h | 2 +-
14 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 3df488921a..163012a7bf 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -670,7 +670,7 @@ static void integratorcp_init(MachineState *machine)
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[25]);
if (qemu_find_nic_info("smc91c111", true, NULL)) {
- smc91c111_init(0xc8000000, pic[27]);
+ smc91c111_init(OBJECT(machine), 0xc8000000, pic[27]);
}
dev = qdev_new_orphan("pl110");
diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index 168ecf35d0..de9919c8cb 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -115,7 +115,7 @@ static void kzm_init(MachineState *machine)
}
if (qemu_find_nic_info("lan9118", true, NULL)) {
- lan9118_init(KZM_LAN9118_ADDR,
+ lan9118_init(OBJECT(machine), KZM_LAN9118_ADDR,
qdev_get_gpio_in(DEVICE(&s->soc.avic), 52));
}
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
index 5a0384a412..e646c7c71e 100644
--- a/hw/arm/mps2.c
+++ b/hw/arm/mps2.c
@@ -461,7 +461,7 @@ static void mps2_common_init(MachineState *machine)
/* In hardware this is a LAN9220; the LAN9118 is software compatible
* except that it doesn't support the checksum-offload feature.
*/
- lan9118_init(mmc->ethernet_base,
+ lan9118_init(OBJECT(machine), mmc->ethernet_base,
qdev_get_gpio_in(armv7m,
mmc->fpga_type == FPGA_AN511 ? 47 : 13));
diff --git a/hw/arm/mps3r.c b/hw/arm/mps3r.c
index caad820d3b..8e249c9b9d 100644
--- a/hw/arm/mps3r.c
+++ b/hw/arm/mps3r.c
@@ -549,7 +549,7 @@ static void mps3r_common_init(MachineState *machine)
* In hardware this is a LAN9220; the LAN9118 is software compatible
* except that it doesn't support the checksum-offload feature.
*/
- lan9118_init(0xe0300000,
+ lan9118_init(OBJECT(machine), 0xe0300000,
qdev_get_gpio_in(gicdev, 18));
create_unimplemented_device("usb", 0xe0301000, 0x1000);
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index f37ddf8073..f51730c487 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -309,9 +309,9 @@ static void realview_init(MachineState *machine,
if (qemu_find_nic_info(is_pb ? "lan9118" : "smc91c111", true, NULL)) {
if (is_pb) {
- lan9118_init(0x4e000000, pic[28]);
+ lan9118_init(OBJECT(machine), 0x4e000000, pic[28]);
} else {
- smc91c111_init(0x4e000000, pic[28]);
+ smc91c111_init(OBJECT(machine), 0x4e000000, pic[28]);
}
}
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index dcc7b7debd..5de99cb854 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -265,7 +265,7 @@ static void versatile_init(MachineState *machine, int board_id)
pci_bus = (PCIBus *)qdev_get_child_bus(dev, "pci");
if (qemu_find_nic_info("smc91c111", true, NULL)) {
- smc91c111_init(0x10010000, sic[25]);
+ smc91c111_init(OBJECT(machine), 0x10010000, sic[25]);
}
pci_init_nic_devices(pci_bus, "rtl8139");
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index ffd3c52d4f..5cbb2c44cb 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -694,7 +694,7 @@ static void vexpress_common_init(MachineState *machine)
/* 0x4e000000 LAN9118 Ethernet */
if (qemu_find_nic_info("lan9118", true, NULL)) {
- lan9118_init(map[VE_ETHERNET], pic[15]);
+ lan9118_init(OBJECT(machine), map[VE_ETHERNET], pic[15]);
}
/* VE_USB: not modelled */
diff --git a/hw/net/lan9118.c b/hw/net/lan9118.c
index 87213c0d8d..91c3533702 100644
--- a/hw/net/lan9118.c
+++ b/hw/net/lan9118.c
@@ -1334,15 +1334,15 @@ static void lan9118_register_types(void)
/* Legacy helper function. Should go away when machine config files are
implemented. */
-void lan9118_init(uint32_t base, qemu_irq irq)
+void lan9118_init(Object *parent, uint32_t base, qemu_irq irq)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan(TYPE_LAN9118);
+ dev = qdev_new(parent, "eth", TYPE_LAN9118);
qemu_configure_nic_device(dev, true, NULL);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, base);
sysbus_connect_irq(s, 0, irq);
}
diff --git a/hw/net/smc91c111.c b/hw/net/smc91c111.c
index 6186d88717..85f3d4d34a 100644
--- a/hw/net/smc91c111.c
+++ b/hw/net/smc91c111.c
@@ -949,15 +949,15 @@ static void smc91c111_register_types(void)
/* Legacy helper function. Should go away when machine config files are
implemented. */
-void smc91c111_init(uint32_t base, qemu_irq irq)
+void smc91c111_init(Object *parent, uint32_t base, qemu_irq irq)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan(TYPE_SMC91C111);
+ dev = qdev_new(parent, "eth", TYPE_SMC91C111);
qemu_configure_nic_device(dev, true, NULL);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, base);
sysbus_connect_irq(s, 0, irq);
}
diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c
index f10ea64798..1d5637f294 100644
--- a/hw/net/spapr_llan.c
+++ b/hw/net/spapr_llan.c
@@ -367,15 +367,15 @@ static void spapr_vlan_instance_finalize(Object *obj)
}
}
-void spapr_vlan_create(SpaprVioBus *bus, NICInfo *nd)
+void spapr_vlan_create(Object *parent, SpaprVioBus *bus, NICInfo *nd)
{
DeviceState *dev;
- dev = qdev_new_orphan("spapr-vlan");
+ dev = qdev_new(parent, "vlan[*]", "spapr-vlan");
qdev_set_nic_properties(dev, nd);
- qdev_realize_and_unref(dev, &bus->bus, &error_fatal);
+ qdev_realize(dev, &bus->bus, &error_fatal);
}
static int spapr_vlan_devnode(SpaprVioDevice *dev, void *fdt, int node_off)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 91f9d873b8..b81db9e8f3 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -3056,7 +3056,7 @@ static void spapr_machine_init(MachineState *machine)
phb = spapr_create_default_phb();
while ((nd = qemu_find_nic_info("spapr-vlan", true, "ibmveth"))) {
- spapr_vlan_create(spapr->vio_bus, nd);
+ spapr_vlan_create(OBJECT(spapr), spapr->vio_bus, nd);
}
pci_init_nic_devices(phb->bus, NULL);
diff --git a/include/hw/net/lan9118.h b/include/hw/net/lan9118.h
index 4bf9da7a63..b199f1912f 100644
--- a/include/hw/net/lan9118.h
+++ b/include/hw/net/lan9118.h
@@ -15,6 +15,6 @@
#define TYPE_LAN9118 "lan9118"
-void lan9118_init(uint32_t, qemu_irq);
+void lan9118_init(Object *parent, uint32_t, qemu_irq);
#endif
diff --git a/include/hw/net/smc91c111.h b/include/hw/net/smc91c111.h
index dba32a233f..788f12678e 100644
--- a/include/hw/net/smc91c111.h
+++ b/include/hw/net/smc91c111.h
@@ -13,6 +13,6 @@
#include "net/net.h"
-void smc91c111_init(uint32_t, qemu_irq);
+void smc91c111_init(Object *parent, uint32_t, qemu_irq);
#endif
diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h
index 72baef6919..fcb29aebff 100644
--- a/include/hw/ppc/spapr_vio.h
+++ b/include/hw/ppc/spapr_vio.h
@@ -138,7 +138,7 @@ int spapr_vio_send_crq(SpaprVioDevice *dev, uint8_t *crq);
SpaprVioDevice *vty_lookup(SpaprMachineState *spapr, target_ulong reg);
void vty_putchars(SpaprVioDevice *sdev, uint8_t *buf, int len);
void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev);
-void spapr_vlan_create(SpaprVioBus *bus, NICInfo *nd);
+void spapr_vlan_create(Object *parent, SpaprVioBus *bus, NICInfo *nd);
void spapr_vscsi_create(Object *parent, SpaprVioBus *bus);
SpaprVioDevice *spapr_vty_get_default(SpaprVioBus *bus);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 039/134] hw/ide: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (37 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 038/134] hw/net: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 040/134] hw/i3c: " Alexander Graf
` (95 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/ide to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/ide/ide-bus.c:78 | qdev_new | OBJECT(bus->qbus.parent) | "drive[*]" | drive is child of the IDE controller device that owns the bus; helper called from many controllers so use bus->qbus.parent
hw/ide/isa.c:87 | isa_new | parent | "ide[*]" | helper called from isapc board init loop; thread Object *parent through isa_ide_init()
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/i386/isapc.c | 3 ++-
hw/ide/ide-bus.c | 5 +++--
hw/ide/isa.c | 7 ++++---
include/hw/ide/isa.h | 3 ++-
4 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/hw/i386/isapc.c b/hw/i386/isapc.c
index 655ec599b5..c2a3f23f2c 100644
--- a/hw/i386/isapc.c
+++ b/hw/i386/isapc.c
@@ -142,7 +142,8 @@ static void pc_init_isa(MachineState *machine)
for (i = 0; i < MAX_IDE_BUS; i++) {
ISADevice *dev;
char busname[] = "ide.0";
- dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
+ dev = isa_ide_init(OBJECT(machine), isa_bus,
+ ide_iobase[i], ide_iobase2[i],
ide_irq[i],
hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
/*
diff --git a/hw/ide/ide-bus.c b/hw/ide/ide-bus.c
index 40ba94235f..4473709a04 100644
--- a/hw/ide/ide-bus.c
+++ b/hw/ide/ide-bus.c
@@ -75,11 +75,12 @@ IDEDevice *ide_bus_create_drive(IDEBus *bus, int unit, DriveInfo *drive)
{
DeviceState *dev;
- dev = qdev_new_orphan(drive->media_cd ? "ide-cd" : "ide-hd");
+ dev = qdev_new(OBJECT(bus->qbus.parent), "drive[*]",
+ drive->media_cd ? "ide-cd" : "ide-hd");
qdev_prop_set_uint32(dev, "unit", unit);
qdev_prop_set_drive_err(dev, "drive", blk_by_legacy_dinfo(drive),
&error_fatal);
- qdev_realize_and_unref(dev, &bus->qbus, &error_fatal);
+ qdev_realize(dev, &bus->qbus, &error_fatal);
return DO_UPCAST(IDEDevice, qdev, dev);
}
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index c9c997344b..37457be035 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -77,19 +77,20 @@ static void isa_ide_realizefn(DeviceState *dev, Error **errp)
ide_bus_register_restart_cb(&s->bus);
}
-ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int irqnum,
+ISADevice *isa_ide_init(Object *parent, ISABus *bus,
+ int iobase, int iobase2, int irqnum,
DriveInfo *hd0, DriveInfo *hd1)
{
DeviceState *dev;
ISADevice *isadev;
ISAIDEState *s;
- isadev = isa_new_orphan(TYPE_ISA_IDE);
+ isadev = isa_new(parent, "ide[*]", TYPE_ISA_IDE);
dev = DEVICE(isadev);
qdev_prop_set_uint32(dev, "iobase", iobase);
qdev_prop_set_uint32(dev, "iobase2", iobase2);
qdev_prop_set_uint32(dev, "irq", irqnum);
- isa_realize_and_unref(isadev, bus, &error_fatal);
+ qdev_realize(dev, BUS(bus), &error_fatal);
s = ISA_IDE(dev);
if (hd0) {
diff --git a/include/hw/ide/isa.h b/include/hw/ide/isa.h
index 1cd0ff1fa6..18fe363a1a 100644
--- a/include/hw/ide/isa.h
+++ b/include/hw/ide/isa.h
@@ -14,7 +14,8 @@
#define TYPE_ISA_IDE "isa-ide"
OBJECT_DECLARE_SIMPLE_TYPE(ISAIDEState, ISA_IDE)
-ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int irqnum,
+ISADevice *isa_ide_init(Object *parent, ISABus *bus,
+ int iobase, int iobase2, int irqnum,
DriveInfo *hd0, DriveInfo *hd1);
#endif
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 040/134] hw/i3c: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (38 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 039/134] hw/ide: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 041/134] hw/pci-bridge: " Alexander Graf
` (94 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/i3c to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/i3c/core.c:550 | qdev_new | parent | id | public helper; thread Object *parent + const char *id through i3c_target_new() and its caller i3c_target_create_simple()
hw/i3c/core.c:626 | i2c_slave_new | parent | id | public helper; thread Object *parent + const char *id through legacy_i2c_device_create_simple()
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/i3c/core.c | 19 +++++++++++--------
include/hw/i3c/i3c.h | 9 ++++++---
2 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/hw/i3c/core.c b/hw/i3c/core.c
index 469d66f1fb..23b32290e5 100644
--- a/hw/i3c/core.c
+++ b/hw/i3c/core.c
@@ -542,12 +542,13 @@ static bool i3c_addr_is_rsvd(uint8_t addr)
return is_rsvd[addr];
}
-I3CTarget *i3c_target_new(const char *name, uint8_t addr, uint8_t dcr,
+I3CTarget *i3c_target_new(Object *parent, const char *id,
+ const char *name, uint8_t addr, uint8_t dcr,
uint8_t bcr, uint64_t pid)
{
DeviceState *dev;
- dev = qdev_new_orphan(name);
+ dev = qdev_new(parent, id, name);
qdev_prop_set_uint8(dev, "static-address", addr);
qdev_prop_set_uint8(dev, "dcr", dcr);
qdev_prop_set_uint8(dev, "bcr", bcr);
@@ -566,12 +567,13 @@ bool i3c_target_realize_and_unref(I3CTarget *dev, I3CBus *bus, Error **errp)
return qdev_realize_and_unref(&dev->parent_obj, &bus->parent_obj, errp);
}
-I3CTarget *i3c_target_create_simple(I3CBus *bus, const char *name, uint8_t addr,
+I3CTarget *i3c_target_create_simple(Object *parent, const char *id,
+ I3CBus *bus, const char *name, uint8_t addr,
uint8_t dcr, uint8_t bcr, uint64_t pid)
{
- I3CTarget *dev = i3c_target_new(name, addr, dcr, bcr, pid);
+ I3CTarget *dev = i3c_target_new(parent, id, name, addr, dcr, bcr, pid);
dev->address = 0;
- i3c_target_realize_and_unref(dev, bus, &error_abort);
+ qdev_realize(DEVICE(dev), BUS(bus), &error_abort);
return dev;
}
@@ -620,12 +622,13 @@ void legacy_i2c_end_transfer(I3CBus *bus)
i2c_end_transfer(bus->i2c_bus);
}
-I2CSlave *legacy_i2c_device_create_simple(I3CBus *bus, const char *name,
+I2CSlave *legacy_i2c_device_create_simple(Object *parent, const char *id,
+ I3CBus *bus, const char *name,
uint8_t addr)
{
- I2CSlave *dev = i2c_slave_new_orphan(name, addr);
+ I2CSlave *dev = i2c_slave_new(parent, id, name, addr);
- i2c_slave_realize_and_unref(dev, bus->i2c_bus, &error_abort);
+ qdev_realize(DEVICE(dev), BUS(bus->i2c_bus), &error_abort);
return dev;
}
diff --git a/include/hw/i3c/i3c.h b/include/hw/i3c/i3c.h
index dcf8d9b143..d0edf7d8bd 100644
--- a/include/hw/i3c/i3c.h
+++ b/include/hw/i3c/i3c.h
@@ -257,7 +257,8 @@ int legacy_i2c_start_transfer(I3CBus *bus, uint8_t address, bool is_recv);
int legacy_i2c_start_recv(I3CBus *bus, uint8_t address);
int legacy_i2c_start_send(I3CBus *bus, uint8_t address);
void legacy_i2c_end_transfer(I3CBus *bus);
-I2CSlave *legacy_i2c_device_create_simple(I3CBus *bus, const char *name,
+I2CSlave *legacy_i2c_device_create_simple(Object *parent, const char *id,
+ I3CBus *bus, const char *name,
uint8_t addr);
/**
@@ -265,7 +266,8 @@ I2CSlave *legacy_i2c_device_create_simple(I3CBus *bus, const char *name,
*
* The target returned from this function still needs to be realized.
*/
-I3CTarget *i3c_target_new(const char *name, uint8_t addr, uint8_t dcr,
+I3CTarget *i3c_target_new(Object *parent, const char *id,
+ const char *name, uint8_t addr, uint8_t dcr,
uint8_t bcr, uint64_t pid);
/**
@@ -274,7 +276,8 @@ I3CTarget *i3c_target_new(const char *name, uint8_t addr, uint8_t dcr,
* Create the target, initialize it, put it on the specified I3C bus, and
* realize it.
*/
-I3CTarget *i3c_target_create_simple(I3CBus *bus, const char *name,
+I3CTarget *i3c_target_create_simple(Object *parent, const char *id,
+ I3CBus *bus, const char *name,
uint8_t addr, uint8_t dcr, uint8_t bcr,
uint64_t pid);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 041/134] hw/pci-bridge: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (39 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 040/134] hw/i3c: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 042/134] hw/sparc64: " Alexander Graf
` (93 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/pci-bridge to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/pci-bridge/pci_expander_bridge.c:362 | qdev_new | OBJECT(dev) | "pxb-host" | pxb_dev_realize_common() is DeviceClass.realize of PXB PCIDevice; child host bridge owned by PXB device
hw/pci-bridge/pci_expander_bridge.c:371 | qdev_new | OBJECT(dev) | "pci-bridge" | same realize(); internal pci-bridge owned by PXB device; error path unref->unparent
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/pci-bridge/pci_expander_bridge.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
index 11a28b5503..bf970dae76 100644
--- a/hw/pci-bridge/pci_expander_bridge.c
+++ b/hw/pci-bridge/pci_expander_bridge.c
@@ -359,7 +359,8 @@ static bool pxb_dev_realize_common(PCIDevice *dev, enum BusType type,
dev_name = dev->qdev.id;
}
- ds = qdev_new_orphan(type == CXL ? TYPE_PXB_CXL_HOST : TYPE_PXB_HOST);
+ ds = qdev_new(OBJECT(dev), "pxb-host",
+ type == CXL ? TYPE_PXB_CXL_HOST : TYPE_PXB_HOST);
if (type == PCIE) {
bus = pci_root_bus_new(ds, dev_name, NULL, NULL, 0, TYPE_PXB_PCIE_BUS);
} else if (type == CXL) {
@@ -368,7 +369,7 @@ static bool pxb_dev_realize_common(PCIDevice *dev, enum BusType type,
PXB_CXL_DEV(dev)->cxl_host_bridge = PXB_CXL_HOST(ds);
} else {
bus = pci_root_bus_new(ds, "pxb-internal", NULL, NULL, 0, TYPE_PXB_BUS);
- bds = qdev_new_orphan("pci-bridge");
+ bds = qdev_new(OBJECT(dev), "pci-bridge", "pci-bridge");
bds->id = g_strdup(dev_name);
qdev_prop_set_uint8(bds, PCI_BRIDGE_DEV_PROP_CHASSIS_NR, pxb->bus_nr);
qdev_prop_set_bit(bds, PCI_BRIDGE_DEV_PROP_SHPC, false);
@@ -388,9 +389,9 @@ static bool pxb_dev_realize_common(PCIDevice *dev, enum BusType type,
goto err_register_bus;
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(ds), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(ds), &error_fatal);
if (bds) {
- qdev_realize_and_unref(bds, &bus->qbus, &error_fatal);
+ qdev_realize(bds, &bus->qbus, &error_fatal);
}
pci_word_test_and_set_mask(dev->config + PCI_STATUS,
@@ -401,9 +402,9 @@ static bool pxb_dev_realize_common(PCIDevice *dev, enum BusType type,
return true;
err_register_bus:
- object_unref(OBJECT(bds));
+ object_unparent(OBJECT(bds));
object_unparent(OBJECT(bus));
- object_unref(OBJECT(ds));
+ object_unparent(OBJECT(ds));
return false;
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 042/134] hw/sparc64: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (40 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 041/134] hw/pci-bridge: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 043/134] hw/sparc: " Alexander Graf
` (92 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/sparc64 to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/sparc64/sun4u.c:332 | isa_create_simple | OBJECT(s) | "i8042" | ebus_realize(): child of EBus device
hw/sparc64/sun4u.c:338 | isa_new | OBJECT(s) | "fdc" | ebus_realize(): child of EBus device; drop _and_unref
hw/sparc64/sun4u.c:345 | qdev_new | OBJECT(s) | "power" | ebus_realize(): child of EBus device; drop _and_unref
hw/sparc64/sun4u.c:426 | qdev_new | parent | "prom" | prom_init() helper: thread Object *parent from board init
hw/sparc64/sun4u.c:510 | qdev_new | parent | "ram" | ram_init() helper: thread Object *parent from board init
hw/sparc64/sun4u.c:562 | qdev_new | OBJECT(machine) | "iommu" | sun4uv_init() board init
hw/sparc64/sun4u.c:571 | qdev_new | OBJECT(machine) | "sabre" | sun4uv_init() board init; PCI host bridge
hw/sparc64/sun4u.c:602 | pci_new_multifunction | OBJECT(machine) | "ebus" | sun4uv_init() board init; drop _and_unref
hw/sparc64/sun4u.c:621 | pci_create_simple | OBJECT(machine) | "vga" | sun4uv_init() board init
hw/sparc64/sun4u.c:635 | pci_new_multifunction | OBJECT(machine) | "nic" | sun4uv_init() board init; onboard NIC; drop _and_unref
hw/sparc64/sun4u.c:651 | pci_new | OBJECT(machine) | "ide" | sun4uv_init() board init; drop _and_unref
hw/sparc64/sun4u.c:657 | qdev_new | OBJECT(machine) | "nvram" | sun4uv_init() board init; drop _and_unref
hw/sparc64/sun4u.c:692 | qdev_new | OBJECT(ebus) | TYPE_FW_CFG | collapse existing object_property_add_child(); keep name; drop _and_unref
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/sparc64/sun4u.c | 60 ++++++++++++++++++++++++----------------------
1 file changed, 31 insertions(+), 29 deletions(-)
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index b60588cf7d..19a54b1f8a 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -329,22 +329,22 @@ static void ebus_realize(PCIDevice *pci_dev, Error **errp)
parallel_hds_isa_init(s->isa_bus, MAX_PARALLEL_PORTS);
/* Keyboard */
- isa_create_simple_orphan(s->isa_bus, TYPE_I8042);
+ isa_create_simple(OBJECT(s), "i8042", s->isa_bus, TYPE_I8042);
/* Floppy */
for (i = 0; i < MAX_FD; i++) {
fd[i] = drive_get(IF_FLOPPY, 0, i);
}
- isa_dev = isa_new_orphan(TYPE_ISA_FDC);
+ isa_dev = isa_new(OBJECT(s), "fdc", TYPE_ISA_FDC);
dev = DEVICE(isa_dev);
qdev_prop_set_uint32(dev, "dma", -1);
- isa_realize_and_unref(isa_dev, s->isa_bus, &error_fatal);
+ qdev_realize(dev, BUS(s->isa_bus), &error_fatal);
isa_fdc_init_drives(isa_dev, fd);
/* Power */
- dev = qdev_new_orphan(TYPE_SUN4U_POWER);
+ dev = qdev_new(OBJECT(s), "power", TYPE_SUN4U_POWER);
sbd = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
memory_region_add_subregion(pci_address_space_io(pci_dev), 0x7240,
sysbus_mmio_get_region(sbd, 0));
@@ -416,16 +416,16 @@ static uint64_t translate_prom_address(void *opaque, uint64_t addr)
}
/* Boot PROM (OpenBIOS) */
-static void prom_init(hwaddr addr, const char *bios_name)
+static void prom_init(Object *parent, hwaddr addr, const char *bios_name)
{
DeviceState *dev;
SysBusDevice *s;
char *filename;
int ret;
- dev = qdev_new_orphan(TYPE_OPENPROM);
+ dev = qdev_new(parent, "prom", TYPE_OPENPROM);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, addr);
@@ -500,19 +500,19 @@ static void ram_realize(DeviceState *dev, Error **errp)
sysbus_init_mmio(sbd, &d->ram);
}
-static void ram_init(hwaddr addr, ram_addr_t RAM_size)
+static void ram_init(Object *parent, hwaddr addr, ram_addr_t RAM_size)
{
DeviceState *dev;
SysBusDevice *s;
RamDevice *d;
/* allocate RAM */
- dev = qdev_new_orphan(TYPE_SUN4U_MEMORY);
+ dev = qdev_new(parent, "ram", TYPE_SUN4U_MEMORY);
s = SYS_BUS_DEVICE(dev);
d = SUN4U_RAM(dev);
d->size = RAM_size;
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, addr);
}
@@ -559,21 +559,21 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
cpu = sparc64_cpu_devinit(machine->cpu_type, hwdef->prom_addr);
/* IOMMU */
- iommu = qdev_new_orphan(TYPE_SUN4U_IOMMU);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(iommu), &error_fatal);
+ iommu = qdev_new(OBJECT(machine), "iommu", TYPE_SUN4U_IOMMU);
+ sysbus_realize(SYS_BUS_DEVICE(iommu), &error_fatal);
/* set up devices */
- ram_init(0, machine->ram_size);
+ ram_init(OBJECT(machine), 0, machine->ram_size);
- prom_init(hwdef->prom_addr, machine->firmware);
+ prom_init(OBJECT(machine), hwdef->prom_addr, machine->firmware);
/* Init sabre (PCI host bridge) */
- sabre = SABRE(qdev_new_orphan(TYPE_SABRE));
+ sabre = SABRE(qdev_new(OBJECT(machine), "sabre", TYPE_SABRE));
qdev_prop_set_uint64(DEVICE(sabre), "special-base", PBM_SPECIAL_BASE);
qdev_prop_set_uint64(DEVICE(sabre), "mem-base", PBM_MEM_BASE);
object_property_set_link(OBJECT(sabre), "iommu", OBJECT(iommu),
&error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(sabre), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(sabre), &error_fatal);
/* sabre_config */
sysbus_mmio_map(SYS_BUS_DEVICE(sabre), 0, PBM_SPECIAL_BASE);
@@ -599,10 +599,11 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
pci_bus_set_slot_reserved_mask(pci_busA, 0xfffffff1);
pci_bus_set_slot_reserved_mask(pci_busB, 0xfffffff0);
- ebus = pci_new_multifunction_orphan(PCI_DEVFN(1, 0), TYPE_EBUS);
+ ebus = pci_new_multifunction(OBJECT(machine), "ebus", PCI_DEVFN(1, 0),
+ TYPE_EBUS);
qdev_prop_set_uint64(DEVICE(ebus), "console-serial-base",
hwdef->console_serial_base);
- pci_realize_and_unref(ebus, pci_busA, &error_fatal);
+ qdev_realize(DEVICE(ebus), BUS(pci_busA), &error_fatal);
/* Wire up "well-known" ISA IRQs to PBM legacy obio IRQs */
qdev_connect_gpio_out_named(DEVICE(ebus), "isa-irq", 7,
@@ -618,7 +619,8 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
switch (vga_interface_type) {
case VGA_STD:
- pci_create_simple_orphan(pci_busA, PCI_DEVFN(2, 0), "VGA");
+ pci_create_simple(OBJECT(machine), "vga", pci_busA, PCI_DEVFN(2, 0),
+ "VGA");
vga_interface_created = true;
break;
case VGA_NONE:
@@ -632,10 +634,11 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
nd = qemu_find_nic_info(mc->default_nic, true, NULL);
if (nd) {
- pci_dev = pci_new_multifunction_orphan(PCI_DEVFN(1, 1), mc->default_nic);
+ pci_dev = pci_new_multifunction(OBJECT(machine), "nic",
+ PCI_DEVFN(1, 1), mc->default_nic);
dev = &pci_dev->qdev;
qdev_set_nic_properties(dev, nd);
- pci_realize_and_unref(pci_dev, pci_busA, &error_fatal);
+ qdev_realize(dev, BUS(pci_busA), &error_fatal);
memcpy(&macaddr, &nd->macaddr.a, sizeof(MACAddr));
onboard_nic = true;
@@ -648,16 +651,16 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
qemu_macaddr_default_if_unset(&macaddr);
}
- pci_dev = pci_new_orphan(PCI_DEVFN(3, 0), "cmd646-ide");
+ pci_dev = pci_new(OBJECT(machine), "ide", PCI_DEVFN(3, 0), "cmd646-ide");
qdev_prop_set_uint32(&pci_dev->qdev, "secondary", 1);
- pci_realize_and_unref(pci_dev, pci_busA, &error_fatal);
+ qdev_realize(DEVICE(pci_dev), BUS(pci_busA), &error_fatal);
pci_ide_create_devs(pci_dev);
/* Map NVRAM into I/O (ebus) space */
- dev = qdev_new_orphan("sysbus-m48t59");
+ dev = qdev_new(OBJECT(machine), "nvram", "sysbus-m48t59");
qdev_prop_set_int32(dev, "base-year", 1968);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
memory_region_add_subregion(pci_address_space_io(ebus), 0x2000,
sysbus_mmio_get_region(s, 0));
nvram = NVRAM(dev);
@@ -689,10 +692,9 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
graphic_width, graphic_height, graphic_depth,
(uint8_t *)&macaddr);
- dev = qdev_new_orphan(TYPE_FW_CFG_IO);
+ dev = qdev_new(OBJECT(ebus), TYPE_FW_CFG, TYPE_FW_CFG_IO);
qdev_prop_set_bit(dev, "dma_enabled", false);
- object_property_add_child(OBJECT(ebus), TYPE_FW_CFG, OBJECT(dev));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
memory_region_add_subregion(pci_address_space_io(ebus), BIOS_CFG_IOPORT,
&FW_CFG_IO(dev)->comb_iomem);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 043/134] hw/sparc: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (41 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 042/134] hw/sparc64: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 044/134] hw/m68k: " Alexander Graf
` (91 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/sparc to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/sparc/leon3.c:295 | qdev_new | OBJECT(machine) | "ahb-pnp" | leon3_generic_hw_init() board init
hw/sparc/leon3.c:302 | qdev_new | OBJECT(machine) | "apb-pnp" | leon3_generic_hw_init() board init
hw/sparc/leon3.c:310 | qdev_new | OBJECT(machine) | "irqmp" | leon3_generic_hw_init() board init
hw/sparc/leon3.c:409 | qdev_new | OBJECT(machine) | "gptimer" | leon3_generic_hw_init() board init
hw/sparc/leon3.c:426 | qdev_new | OBJECT(machine) | "uart" | leon3_generic_hw_init() board init
hw/sparc/sun4m.c:283 | qdev_new | parent | "iommu" | iommu_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:305 | qdev_new | parent | "dma" | sparc32_dma_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:350 | qdev_new | parent | "intctl" | slavio_intctl_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:379 | qdev_new | parent | "timer" | slavio_timer_init_all() helper: thread Object *parent from board init
hw/sparc/sun4m.c:417 | qdev_new | parent | "misc" | slavio_misc_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:454 | qdev_new | parent | "ecc" | ecc_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:470 | qdev_new | parent | "apc" | apc_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:484 | qdev_new | parent | "tcx" | tcx_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:536 | qdev_new | parent | "cgthree" | cg3_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:565 | qdev_new | parent | "idreg" | idreg_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:624 | qdev_new | parent | "afx" | afx_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:681 | qdev_new | parent | "prom" | prom_init() helper: thread Object *parent from board init
hw/sparc/sun4m.c:838 | qdev_new | OBJECT(machine) | "ram" | sun4m_hw_init() board init
hw/sparc/sun4m.c:950 | qdev_new | OBJECT(machine) | "nvram" | sun4m_hw_init() board init
hw/sparc/sun4m.c:962 | qdev_new | OBJECT(machine) | "escc-kbd" | sun4m_hw_init() board init; keyboard/mouse ESCC
hw/sparc/sun4m.c:975 | qdev_new | OBJECT(machine) | "ms-kb-orgate" | sun4m_hw_init() board init; drop _and_unref
hw/sparc/sun4m.c:982 | qdev_new | OBJECT(machine) | "escc-serial" | sun4m_hw_init() board init; serial ESCC
hw/sparc/sun4m.c:996 | qdev_new | OBJECT(machine) | "serial-orgate" | sun4m_hw_init() board init; drop _and_unref
hw/sparc/sun4m.c:1022 | sysbus_create_simple | OBJECT(machine) | "cs4231" | sun4m_hw_init() board init
hw/sparc/sun4m.c:1055 | qdev_new | OBJECT(machine) | TYPE_FW_CFG | collapse existing object_property_add_child(); keep name; drop _and_unref
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/sparc/leon3.c | 22 ++++----
hw/sparc/sun4m.c | 142 ++++++++++++++++++++++++-----------------------
2 files changed, 85 insertions(+), 79 deletions(-)
diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index d921cd8dc6..a96ccca8e3 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -292,25 +292,27 @@ static void leon3_generic_hw_init(MachineState *machine)
qemu_register_reset(leon3_cpu_reset, &reset_info->info[i]);
}
- ahb_pnp = GRLIB_AHB_PNP(qdev_new_orphan(TYPE_GRLIB_AHB_PNP));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(ahb_pnp), &error_fatal);
+ ahb_pnp = GRLIB_AHB_PNP(qdev_new(OBJECT(machine), "ahb-pnp",
+ TYPE_GRLIB_AHB_PNP));
+ sysbus_realize(SYS_BUS_DEVICE(ahb_pnp), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(ahb_pnp), 0, LEON3_AHB_PNP_OFFSET);
grlib_ahb_pnp_add_entry(ahb_pnp, 0, 0, GRLIB_VENDOR_GAISLER,
GRLIB_LEON3_DEV, GRLIB_AHB_MASTER,
GRLIB_CPU_AREA);
- apb_pnp = GRLIB_APB_PNP(qdev_new_orphan(TYPE_GRLIB_APB_PNP));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(apb_pnp), &error_fatal);
+ apb_pnp = GRLIB_APB_PNP(qdev_new(OBJECT(machine), "apb-pnp",
+ TYPE_GRLIB_APB_PNP));
+ sysbus_realize(SYS_BUS_DEVICE(apb_pnp), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(apb_pnp), 0, LEON3_APB_PNP_OFFSET);
grlib_ahb_pnp_add_entry(ahb_pnp, LEON3_APB_PNP_OFFSET, 0xFFF,
GRLIB_VENDOR_GAISLER, GRLIB_APBMST_DEV,
GRLIB_AHB_SLAVE, GRLIB_AHBMEM_AREA);
/* Allocate IRQ manager */
- irqmpdev = qdev_new_orphan(TYPE_GRLIB_IRQMP);
+ irqmpdev = qdev_new(OBJECT(machine), "irqmp", TYPE_GRLIB_IRQMP);
object_property_set_int(OBJECT(irqmpdev), "ncpus", machine->smp.cpus,
&error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(irqmpdev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(irqmpdev), &error_fatal);
for (i = 0; i < machine->smp.cpus; i++) {
cpu = reset_info->info[i].cpu;
@@ -406,11 +408,11 @@ static void leon3_generic_hw_init(MachineState *machine)
}
/* Allocate timers */
- dev = qdev_new_orphan(TYPE_GRLIB_GPTIMER);
+ dev = qdev_new(OBJECT(machine), "gptimer", TYPE_GRLIB_GPTIMER);
qdev_prop_set_uint32(dev, "nr-timers", LEON3_TIMER_COUNT);
qdev_prop_set_uint32(dev, "frequency", CPU_CLK);
qdev_prop_set_uint32(dev, "irq-line", LEON3_TIMER_IRQ);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, LEON3_TIMER_OFFSET);
for (i = 0; i < LEON3_TIMER_COUNT; i++) {
@@ -423,9 +425,9 @@ static void leon3_generic_hw_init(MachineState *machine)
0, LEON3_TIMER_IRQ, GRLIB_APBIO_AREA);
/* Allocate uart */
- dev = qdev_new_orphan(TYPE_GRLIB_APB_UART);
+ dev = qdev_new(OBJECT(machine), "uart", TYPE_GRLIB_APB_UART);
qdev_prop_set_chr(dev, "chrdev", serial_hd(0));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, LEON3_UART_OFFSET);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
qdev_get_gpio_in(irqmpdev, LEON3_UART_IRQ));
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 52627dbdec..b0f018a3c5 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -275,22 +275,23 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename,
return kernel_size;
}
-static void *iommu_init(hwaddr addr, uint32_t version, qemu_irq irq)
+static void *iommu_init(Object *parent, hwaddr addr, uint32_t version,
+ qemu_irq irq)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan(TYPE_SUN4M_IOMMU);
+ dev = qdev_new(parent, "iommu", TYPE_SUN4M_IOMMU);
qdev_prop_set_uint32(dev, "version", version);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_connect_irq(s, 0, irq);
sysbus_mmio_map(s, 0, addr);
return s;
}
-static void *sparc32_dma_init(hwaddr dma_base,
+static void *sparc32_dma_init(Object *parent, hwaddr dma_base,
hwaddr esp_base, qemu_irq espdma_irq,
hwaddr le_base, qemu_irq ledma_irq,
MACAddr *mac)
@@ -302,7 +303,7 @@ static void *sparc32_dma_init(hwaddr dma_base,
SysBusPCNetState *lance;
NICInfo *nd = qemu_find_nic_info("lance", true, NULL);
- dma = qdev_new_orphan(TYPE_SPARC32_DMA);
+ dma = qdev_new(parent, "dma", TYPE_SPARC32_DMA);
espdma = SPARC32_ESPDMA_DEVICE(object_resolve_path_component(
OBJECT(dma), "espdma"));
@@ -322,7 +323,7 @@ static void *sparc32_dma_init(hwaddr dma_base,
qdev_prop_set_macaddr(DEVICE(lance), "mac", mac->a);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dma), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dma), &error_fatal);
sysbus_connect_irq(SYS_BUS_DEVICE(espdma), 0, espdma_irq);
@@ -338,7 +339,7 @@ static void *sparc32_dma_init(hwaddr dma_base,
return dma;
}
-static DeviceState *slavio_intctl_init(hwaddr addr,
+static DeviceState *slavio_intctl_init(Object *parent, hwaddr addr,
hwaddr addrg,
unsigned int smp_cpus,
DeviceState **cpus)
@@ -347,10 +348,10 @@ static DeviceState *slavio_intctl_init(hwaddr addr,
SysBusDevice *s;
unsigned int i, j;
- dev = qdev_new_orphan("slavio_intctl");
+ dev = qdev_new(parent, "intctl", "slavio_intctl");
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
for (i = 0; i < smp_cpus; i++) {
for (j = 0; j < MAX_PILS; j++) {
@@ -369,17 +370,18 @@ static DeviceState *slavio_intctl_init(hwaddr addr,
#define SYS_TIMER_OFFSET 0x10000ULL
#define CPU_TIMER_OFFSET(cpu) (0x1000ULL * cpu)
-static void slavio_timer_init_all(hwaddr addr, qemu_irq master_irq,
+static void slavio_timer_init_all(Object *parent, hwaddr addr,
+ qemu_irq master_irq,
qemu_irq *cpu_irqs, unsigned int num_cpus)
{
DeviceState *dev;
SysBusDevice *s;
unsigned int i;
- dev = qdev_new_orphan("slavio_timer");
+ dev = qdev_new(parent, "timer", "slavio_timer");
qdev_prop_set_uint32(dev, "num_cpus", num_cpus);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_connect_irq(s, 0, master_irq);
sysbus_mmio_map(s, 0, addr + SYS_TIMER_OFFSET);
@@ -406,7 +408,7 @@ static Notifier slavio_system_powerdown_notifier = {
#define MISC_MDM 0x01b00000
#define MISC_SYS 0x01f00000
-static void slavio_misc_init(hwaddr base,
+static void slavio_misc_init(Object *parent, hwaddr base,
hwaddr aux1_base,
hwaddr aux2_base, qemu_irq irq,
qemu_irq fdc_tc)
@@ -414,9 +416,9 @@ static void slavio_misc_init(hwaddr base,
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan("slavio_misc");
+ dev = qdev_new(parent, "misc", "slavio_misc");
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
if (base) {
/* 8 bit registers */
/* Slavio control */
@@ -446,15 +448,16 @@ static void slavio_misc_init(hwaddr base,
qemu_register_powerdown_notifier(&slavio_system_powerdown_notifier);
}
-static void ecc_init(hwaddr base, qemu_irq irq, uint32_t version)
+static void ecc_init(Object *parent, hwaddr base, qemu_irq irq,
+ uint32_t version)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan("eccmemctl");
+ dev = qdev_new(parent, "ecc", "eccmemctl");
qdev_prop_set_uint32(dev, "version", version);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_connect_irq(s, 0, irq);
sysbus_mmio_map(s, 0, base);
if (version == 0) { // SS-600MP only
@@ -462,32 +465,32 @@ static void ecc_init(hwaddr base, qemu_irq irq, uint32_t version)
}
}
-static void apc_init(hwaddr power_base, qemu_irq cpu_halt)
+static void apc_init(Object *parent, hwaddr power_base, qemu_irq cpu_halt)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan("apc");
+ dev = qdev_new(parent, "apc", "apc");
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
/* Power management (APC) XXX: not a Slavio device */
sysbus_mmio_map(s, 0, power_base);
sysbus_connect_irq(s, 0, cpu_halt);
}
-static void tcx_init(hwaddr addr, qemu_irq irq, int vram_size, int width,
- int height, int depth)
+static void tcx_init(Object *parent, hwaddr addr, qemu_irq irq, int vram_size,
+ int width, int height, int depth)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan("sun-tcx");
+ dev = qdev_new(parent, "tcx", "sun-tcx");
qdev_prop_set_uint32(dev, "vram_size", vram_size);
qdev_prop_set_uint16(dev, "width", width);
qdev_prop_set_uint16(dev, "height", height);
qdev_prop_set_uint16(dev, "depth", depth);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
/* 10/ROM : FCode ROM */
sysbus_mmio_map(s, 0, addr);
@@ -527,19 +530,19 @@ static void tcx_init(hwaddr addr, qemu_irq irq, int vram_size, int width,
sysbus_connect_irq(s, 0, irq);
}
-static void cg3_init(hwaddr addr, qemu_irq irq, int vram_size, int width,
- int height, int depth)
+static void cg3_init(Object *parent, hwaddr addr, qemu_irq irq, int vram_size,
+ int width, int height, int depth)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan("cgthree");
+ dev = qdev_new(parent, "cgthree", "cgthree");
qdev_prop_set_uint32(dev, "vram-size", vram_size);
qdev_prop_set_uint16(dev, "width", width);
qdev_prop_set_uint16(dev, "height", height);
qdev_prop_set_uint16(dev, "depth", depth);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
/* FCode ROM */
sysbus_mmio_map(s, 0, addr);
@@ -557,14 +560,14 @@ static void cg3_init(hwaddr addr, qemu_irq irq, int vram_size, int width,
static const uint8_t idreg_data[] = { 0xfe, 0x81, 0x01, 0x03 };
-static void idreg_init(hwaddr addr)
+static void idreg_init(Object *parent, hwaddr addr)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan(TYPE_MACIO_ID_REGISTER);
+ dev = qdev_new(parent, "idreg", TYPE_MACIO_ID_REGISTER);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, addr);
address_space_write_rom(&address_space_memory, addr,
@@ -616,14 +619,14 @@ struct AFXState {
};
/* SS-5 TCX AFX register */
-static void afx_init(hwaddr addr)
+static void afx_init(Object *parent, hwaddr addr)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan(TYPE_TCX_AFX);
+ dev = qdev_new(parent, "afx", TYPE_TCX_AFX);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, addr);
}
@@ -671,16 +674,16 @@ static uint64_t translate_prom_address(void *opaque, uint64_t addr)
return addr + *base_addr - PROM_VADDR;
}
-static void prom_init(hwaddr addr, const char *bios_name)
+static void prom_init(Object *parent, hwaddr addr, const char *bios_name)
{
DeviceState *dev;
SysBusDevice *s;
char *filename;
int ret;
- dev = qdev_new_orphan(TYPE_OPENPROM);
+ dev = qdev_new(parent, "prom", TYPE_OPENPROM);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, addr);
@@ -835,9 +838,9 @@ static void sun4m_hw_init(MachineState *machine)
}
/* Create and map RAM frontend */
- dev = qdev_new_orphan("memory");
+ dev = qdev_new(OBJECT(machine), "ram", "memory");
object_property_set_link(OBJECT(dev), "memdev", OBJECT(ram_memdev), &error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0);
/* models without ECC don't trap when missing ram is accessed */
@@ -846,9 +849,9 @@ static void sun4m_hw_init(MachineState *machine)
hwdef->max_mem - machine->ram_size);
}
- prom_init(hwdef->slavio_base, machine->firmware);
+ prom_init(OBJECT(machine), hwdef->slavio_base, machine->firmware);
- slavio_intctl = slavio_intctl_init(hwdef->intctl_base,
+ slavio_intctl = slavio_intctl_init(OBJECT(machine), hwdef->intctl_base,
hwdef->intctl_base + 0x10000ULL,
smp_cpus,
cpus);
@@ -861,14 +864,15 @@ static void sun4m_hw_init(MachineState *machine)
}
if (hwdef->idreg_base) {
- idreg_init(hwdef->idreg_base);
+ idreg_init(OBJECT(machine), hwdef->idreg_base);
}
if (hwdef->afx_base) {
- afx_init(hwdef->afx_base);
+ afx_init(OBJECT(machine), hwdef->afx_base);
}
- iommu_init(hwdef->iommu_base, hwdef->iommu_version, slavio_irq[30]);
+ iommu_init(OBJECT(machine), hwdef->iommu_base, hwdef->iommu_version,
+ slavio_irq[30]);
if (hwdef->iommu_pad_base) {
/* On the real hardware (SS-5, LX) the MMU is not padded, but aliased.
@@ -879,7 +883,7 @@ static void sun4m_hw_init(MachineState *machine)
hwdef->iommu_pad_base, hwdef->iommu_pad_len);
}
- sparc32_dma_init(hwdef->dma_base,
+ sparc32_dma_init(OBJECT(machine), hwdef->dma_base,
hwdef->esp_base, slavio_irq[18],
hwdef->le_base, slavio_irq[16], &hostid);
@@ -911,7 +915,7 @@ static void sun4m_hw_init(MachineState *machine)
}
/* sbus irq 5 */
- cg3_init(hwdef->tcx_base, slavio_irq[11], 0x00100000,
+ cg3_init(OBJECT(machine), hwdef->tcx_base, slavio_irq[11], 0x00100000,
graphic_width, graphic_height, graphic_depth);
vga_interface_created = true;
} else {
@@ -927,7 +931,7 @@ static void sun4m_hw_init(MachineState *machine)
exit(1);
}
- tcx_init(hwdef->tcx_base, slavio_irq[11], 0x00100000,
+ tcx_init(OBJECT(machine), hwdef->tcx_base, slavio_irq[11], 0x00100000,
graphic_width, graphic_height, graphic_depth);
vga_interface_created = true;
}
@@ -947,19 +951,20 @@ static void sun4m_hw_init(MachineState *machine)
create_unimplemented_device("sun-sx", hwdef->sx_base, 0x2000);
}
- dev = qdev_new_orphan("sysbus-m48t08");
+ dev = qdev_new(OBJECT(machine), "nvram", "sysbus-m48t08");
qdev_prop_set_int32(dev, "base-year", 1968);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_connect_irq(s, 0, slavio_irq[0]);
sysbus_mmio_map(s, 0, hwdef->nvram_base);
nvram = NVRAM(dev);
- slavio_timer_init_all(hwdef->counter_base, slavio_irq[19], slavio_cpu_irq, smp_cpus);
+ slavio_timer_init_all(OBJECT(machine), hwdef->counter_base, slavio_irq[19],
+ slavio_cpu_irq, smp_cpus);
/* Slavio TTYA (base+4, Linux ttyS0) is the first QEMU serial device
Slavio TTYB (base+0, Linux ttyS1) is the second QEMU serial device */
- dev = qdev_new_orphan(TYPE_ESCC);
+ dev = qdev_new(OBJECT(machine), "escc-kbd", TYPE_ESCC);
qdev_prop_set_uint32(dev, "disabled", !machine->enable_graphics);
qdev_prop_set_uint32(dev, "frequency", ESCC_CLOCK);
qdev_prop_set_uint32(dev, "it_shift", 1);
@@ -968,18 +973,18 @@ static void sun4m_hw_init(MachineState *machine)
qdev_prop_set_uint32(dev, "chnBtype", escc_mouse);
qdev_prop_set_uint32(dev, "chnAtype", escc_kbd);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, hwdef->ms_kb_base);
/* Logically OR both its IRQs together */
- ms_kb_orgate = qdev_new_orphan(TYPE_OR_IRQ);
+ ms_kb_orgate = qdev_new(OBJECT(machine), "ms-kb-orgate", TYPE_OR_IRQ);
object_property_set_int(OBJECT(ms_kb_orgate), "num-lines", 2, &error_fatal);
- qdev_realize_and_unref(ms_kb_orgate, NULL, &error_fatal);
+ qdev_realize(ms_kb_orgate, NULL, &error_fatal);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(ms_kb_orgate, 0));
sysbus_connect_irq(s, 1, qdev_get_gpio_in(ms_kb_orgate, 1));
qdev_connect_gpio_out(ms_kb_orgate, 0, slavio_irq[14]);
- dev = qdev_new_orphan(TYPE_ESCC);
+ dev = qdev_new(OBJECT(machine), "escc-serial", TYPE_ESCC);
qdev_prop_set_uint32(dev, "disabled", 0);
qdev_prop_set_uint32(dev, "frequency", ESCC_CLOCK);
qdev_prop_set_uint32(dev, "it_shift", 1);
@@ -989,20 +994,21 @@ static void sun4m_hw_init(MachineState *machine)
qdev_prop_set_uint32(dev, "chnAtype", escc_serial);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, hwdef->serial_base);
/* Logically OR both its IRQs together */
- serial_orgate = qdev_new_orphan(TYPE_OR_IRQ);
+ serial_orgate = qdev_new(OBJECT(machine), "serial-orgate", TYPE_OR_IRQ);
object_property_set_int(OBJECT(serial_orgate), "num-lines", 2,
&error_fatal);
- qdev_realize_and_unref(serial_orgate, NULL, &error_fatal);
+ qdev_realize(serial_orgate, NULL, &error_fatal);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(serial_orgate, 0));
sysbus_connect_irq(s, 1, qdev_get_gpio_in(serial_orgate, 1));
qdev_connect_gpio_out(serial_orgate, 0, slavio_irq[15]);
if (hwdef->apc_base) {
- apc_init(hwdef->apc_base, qemu_allocate_irq(cpu_halt_signal, NULL, 0));
+ apc_init(OBJECT(machine), hwdef->apc_base,
+ qemu_allocate_irq(cpu_halt_signal, NULL, 0));
}
if (hwdef->fd_base) {
@@ -1015,12 +1021,12 @@ static void sun4m_hw_init(MachineState *machine)
fdc_tc = qemu_allocate_irq(dummy_fdc_tc, NULL, 0);
}
- slavio_misc_init(hwdef->slavio_base, hwdef->aux1_base, hwdef->aux2_base,
- slavio_irq[30], fdc_tc);
+ slavio_misc_init(OBJECT(machine), hwdef->slavio_base, hwdef->aux1_base,
+ hwdef->aux2_base, slavio_irq[30], fdc_tc);
if (hwdef->cs_base) {
- sysbus_create_simple_orphan("sun-CS4231", hwdef->cs_base,
- slavio_irq[5]);
+ sysbus_create_simple(OBJECT(machine), "cs4231", "sun-CS4231",
+ hwdef->cs_base, slavio_irq[5]);
}
if (hwdef->dbri_base) {
@@ -1049,17 +1055,15 @@ static void sun4m_hw_init(MachineState *machine)
hwdef->nvram_machine_id, "Sun4m");
if (hwdef->ecc_base)
- ecc_init(hwdef->ecc_base, slavio_irq[28],
+ ecc_init(OBJECT(machine), hwdef->ecc_base, slavio_irq[28],
hwdef->ecc_version);
- dev = qdev_new_orphan(TYPE_FW_CFG_MEM);
+ dev = qdev_new(OBJECT(machine), TYPE_FW_CFG, TYPE_FW_CFG_MEM);
fw_cfg = FW_CFG(dev);
qdev_prop_set_uint32(dev, "data_width", 1);
qdev_prop_set_bit(dev, "dma_enabled", false);
- object_property_add_child(OBJECT(qdev_get_machine()), TYPE_FW_CFG,
- OBJECT(fw_cfg));
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, CFG_ADDR);
sysbus_mmio_map(s, 1, CFG_ADDR + 2);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 044/134] hw/m68k: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (42 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 043/134] hw/sparc: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 045/134] hw/rtc: " Alexander Graf
` (90 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/m68k to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/m68k/an5206.c:28 | qdev_new | parent | "mbar" | mcf5206_init() helper: thread Object *parent from board init
hw/m68k/an5206.c:49 | cpu_create | OBJECT(machine) | "cpu" | an5206_init() board init
hw/m68k/mcf5208.c:291 | cpu_create | OBJECT(machine) | "cpu" | mcf5208evb_init() board init
hw/m68k/mcf_intc.c:214 | qdev_new | parent | "intc" | mcf_intc_init() global helper: add Object *parent, update header + caller
hw/m68k/next-cube.c:1263 | cpu_create | OBJECT(machine) | "cpu" | next_cube_init() board init
hw/m68k/next-cube.c:1275 | qdev_new | OBJECT(machine) | "pc" | next_cube_init() board init; peripheral controller
hw/m68k/next-cube.c:1283 | sysbus_create_simple | OBJECT(machine) | "fb" | next_cube_init() board init; framebuffer
hw/m68k/next-cube.c:1322 | sysbus_create_simple | OBJECT(machine) | "kbd" | next_cube_init() board init
hw/m68k/q800.c:358 | qdev_new | OBJECT(machine) | "adb-keyboard" | q800_machine_init() board init; drop _and_unref
hw/m68k/q800.c:360 | qdev_new | OBJECT(machine) | "adb-mouse" | q800_machine_init() board init; drop _and_unref
hw/m68k/virt.c:148 | cpu_create | OBJECT(machine) | "cpu" | virt_init() board init
hw/m68k/virt.c:158 | qdev_new | OBJECT(machine) | "irqc" | virt_init() board init
hw/m68k/virt.c:172 | qdev_new | OBJECT(machine) | "pic[*]" | virt_init() board init; loop
hw/m68k/virt.c:186 | qdev_new | OBJECT(machine) | "rtc[*]" | virt_init() board init; loop
hw/m68k/virt.c:197 | qdev_new | OBJECT(machine) | "tty" | virt_init() board init
hw/m68k/virt.c:205 | sysbus_create_simple | OBJECT(machine) | "virt-ctrl" | virt_init() board init
hw/m68k/virt.c:211 | qdev_new | OBJECT(machine) | "virtio-mmio[*]" | virt_init() board init; loop
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/m68k/an5206.c | 11 ++++++-----
hw/m68k/mcf5208.c | 4 ++--
hw/m68k/mcf_intc.c | 7 ++++---
hw/m68k/next-cube.c | 10 +++++-----
hw/m68k/q800.c | 8 ++++----
hw/m68k/virt.c | 25 +++++++++++++------------
include/hw/m68k/mcf.h | 2 +-
7 files changed, 35 insertions(+), 32 deletions(-)
diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
index b649605140..5027311cad 100644
--- a/hw/m68k/an5206.c
+++ b/hw/m68k/an5206.c
@@ -20,16 +20,17 @@
#define AN5206_MBAR_ADDR 0x10000000
#define AN5206_RAMBAR_ADDR 0x20000000
-static void mcf5206_init(M68kCPU *cpu, MemoryRegion *sysmem, uint32_t base)
+static void mcf5206_init(Object *parent, M68kCPU *cpu, MemoryRegion *sysmem,
+ uint32_t base)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan(TYPE_MCF5206_MBAR);
+ dev = qdev_new(parent, "mbar", TYPE_MCF5206_MBAR);
object_property_set_link(OBJECT(dev), "m68k-cpu",
OBJECT(cpu), &error_abort);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
memory_region_add_subregion(sysmem, base, sysbus_mmio_get_region(s, 0));
}
@@ -46,7 +47,7 @@ static void an5206_init(MachineState *machine)
MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *sram = g_new(MemoryRegion, 1);
- cpu = M68K_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = M68K_CPU(cpu_create(OBJECT(machine), "cpu", machine->cpu_type));
env = &cpu->env;
/* Initialize CPU registers. */
@@ -62,7 +63,7 @@ static void an5206_init(MachineState *machine)
memory_region_init_ram(sram, NULL, "an5206.sram", 512, &error_fatal);
memory_region_add_subregion(address_space_mem, AN5206_RAMBAR_ADDR, sram);
- mcf5206_init(cpu, address_space_mem, AN5206_MBAR_ADDR);
+ mcf5206_init(OBJECT(machine), cpu, address_space_mem, AN5206_MBAR_ADDR);
/* Load kernel. */
if (!kernel_filename) {
diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
index d79ec173e6..0b8636daa9 100644
--- a/hw/m68k/mcf5208.c
+++ b/hw/m68k/mcf5208.c
@@ -288,7 +288,7 @@ static void mcf5208evb_init(MachineState *machine)
MemoryRegion *sram = g_new(MemoryRegion, 1);
DeviceState *intc;
- cpu = M68K_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = M68K_CPU(cpu_create(OBJECT(machine), "cpu", machine->cpu_type));
env = &cpu->env;
/* Initialize CPU registers. */
@@ -307,7 +307,7 @@ static void mcf5208evb_init(MachineState *machine)
memory_region_add_subregion(address_space_mem, 0x80000000, sram);
/* Internal peripherals. */
- intc = mcf_intc_init(address_space_mem, 0xfc048000, cpu);
+ intc = mcf_intc_init(OBJECT(machine), address_space_mem, 0xfc048000, cpu);
mcf_uart_create_mmap(0xfc060000, qdev_get_gpio_in(intc, 26), serial_hd(0));
mcf_uart_create_mmap(0xfc064000, qdev_get_gpio_in(intc, 27), serial_hd(1));
diff --git a/hw/m68k/mcf_intc.c b/hw/m68k/mcf_intc.c
index 123bd7e385..5ae8fddc52 100644
--- a/hw/m68k/mcf_intc.c
+++ b/hw/m68k/mcf_intc.c
@@ -207,14 +207,15 @@ static void mcf_intc_register_types(void)
type_init(mcf_intc_register_types)
-DeviceState *mcf_intc_init(MemoryRegion *sysmem, hwaddr base, M68kCPU *cpu)
+DeviceState *mcf_intc_init(Object *parent, MemoryRegion *sysmem, hwaddr base,
+ M68kCPU *cpu)
{
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_MCF_INTC);
+ dev = qdev_new(parent, "intc", TYPE_MCF_INTC);
object_property_set_link(OBJECT(dev), "m68k-cpu",
OBJECT(cpu), &error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
memory_region_add_subregion(sysmem, base,
sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0));
return dev;
diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c
index 530dc1ab59..c80d32ef29 100644
--- a/hw/m68k/next-cube.c
+++ b/hw/m68k/next-cube.c
@@ -1260,7 +1260,7 @@ static void next_cube_init(MachineState *machine)
DeviceState *pcdev;
/* Initialize the cpu core */
- cpu = M68K_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = M68K_CPU(cpu_create(OBJECT(machine), "cpu", machine->cpu_type));
if (!cpu) {
error_report("Unable to find m68k CPU definition");
exit(1);
@@ -1272,15 +1272,15 @@ static void next_cube_init(MachineState *machine)
env->sr = 0x2700;
/* Peripheral Controller */
- pcdev = qdev_new_orphan(TYPE_NEXT_PC);
+ pcdev = qdev_new(OBJECT(machine), "pc", TYPE_NEXT_PC);
object_property_set_link(OBJECT(pcdev), "cpu", OBJECT(cpu), &error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(pcdev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(pcdev), &error_fatal);
/* 64MB RAM starting at 0x04000000 */
memory_region_add_subregion(sysmem, 0x04000000, machine->ram);
/* Framebuffer */
- sysbus_create_simple_orphan(TYPE_NEXTFB, 0x0B000000, NULL);
+ sysbus_create_simple(OBJECT(machine), "fb", TYPE_NEXTFB, 0x0B000000, NULL);
/* MMIO */
sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 0, 0x02005000);
@@ -1319,7 +1319,7 @@ static void next_cube_init(MachineState *machine)
memory_region_add_subregion(sysmem, 0x820c0000, &m->bmapm2);
/* KBD */
- sysbus_create_simple_orphan(TYPE_NEXTKBD, 0x0200e000, NULL);
+ sysbus_create_simple(OBJECT(machine), "kbd", TYPE_NEXTKBD, 0x0200e000, NULL);
/* Load ROM here */
memory_region_init_rom(&m->rom, NULL, "next.rom", 0x20000, &error_fatal);
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 688299ee2d..15b3bcab5f 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -355,10 +355,10 @@ static void q800_machine_init(MachineState *machine)
"auxmode", 0));
adb_bus = qdev_get_child_bus(DEVICE(&m->via1), "adb.0");
- dev = qdev_new_orphan(TYPE_ADB_KEYBOARD);
- qdev_realize_and_unref(dev, adb_bus, &error_fatal);
- dev = qdev_new_orphan(TYPE_ADB_MOUSE);
- qdev_realize_and_unref(dev, adb_bus, &error_fatal);
+ dev = qdev_new(OBJECT(machine), "adb-keyboard", TYPE_ADB_KEYBOARD);
+ qdev_realize(dev, adb_bus, &error_fatal);
+ dev = qdev_new(OBJECT(machine), "adb-mouse", TYPE_ADB_MOUSE);
+ qdev_realize(dev, adb_bus, &error_fatal);
/* VIA 2 */
object_initialize_child(OBJECT(machine), "via2", &m->via2,
diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c
index 64ac8c8166..5d5ea72314 100644
--- a/hw/m68k/virt.c
+++ b/hw/m68k/virt.c
@@ -145,7 +145,7 @@ static void virt_init(MachineState *machine)
reset_info = g_new0(ResetInfo, 1);
/* init CPUs */
- cpu = M68K_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = M68K_CPU(cpu_create(OBJECT(machine), "cpu", machine->cpu_type));
reset_info->cpu = cpu;
qemu_register_reset(main_cpu_reset, reset_info);
@@ -155,10 +155,10 @@ static void virt_init(MachineState *machine)
/* IRQ Controller */
- irqc_dev = qdev_new_orphan(TYPE_M68K_IRQC);
+ irqc_dev = qdev_new(OBJECT(machine), "irqc", TYPE_M68K_IRQC);
object_property_set_link(OBJECT(irqc_dev), "m68k-cpu",
OBJECT(cpu), &error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(irqc_dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(irqc_dev), &error_fatal);
/*
* 6 goldfish-pic
@@ -169,10 +169,10 @@ static void virt_init(MachineState *machine)
*/
io_base = VIRT_GF_PIC_MMIO_BASE;
for (i = 0; i < VIRT_GF_PIC_NB; i++) {
- pic_dev[i] = qdev_new_orphan(TYPE_GOLDFISH_PIC);
+ pic_dev[i] = qdev_new(OBJECT(machine), "pic[*]", TYPE_GOLDFISH_PIC);
sysbus = SYS_BUS_DEVICE(pic_dev[i]);
qdev_prop_set_uint8(pic_dev[i], "index", i);
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
sysbus_mmio_map(sysbus, 0, io_base);
sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(irqc_dev, i));
@@ -183,10 +183,10 @@ static void virt_init(MachineState *machine)
/* goldfish-rtc */
io_base = VIRT_GF_RTC_MMIO_BASE;
for (i = 0; i < VIRT_GF_RTC_NB; i++) {
- dev = qdev_new_orphan(TYPE_GOLDFISH_RTC);
+ dev = qdev_new(OBJECT(machine), "rtc[*]", TYPE_GOLDFISH_RTC);
qdev_prop_set_bit(dev, "big-endian", true);
sysbus = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
sysbus_mmio_map(sysbus, 0, io_base);
sysbus_connect_irq(sysbus, 0, PIC_GPIO(VIRT_GF_RTC_IRQ_BASE + i));
@@ -194,24 +194,25 @@ static void virt_init(MachineState *machine)
}
/* goldfish-tty */
- dev = qdev_new_orphan(TYPE_GOLDFISH_TTY);
+ dev = qdev_new(OBJECT(machine), "tty", TYPE_GOLDFISH_TTY);
sysbus = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
sysbus_mmio_map(sysbus, 0, VIRT_GF_TTY_MMIO_BASE);
sysbus_connect_irq(sysbus, 0, PIC_GPIO(VIRT_GF_TTY_IRQ_BASE));
/* virt controller */
- dev = sysbus_create_simple_orphan(TYPE_VIRT_CTRL, VIRT_CTRL_MMIO_BASE,
+ dev = sysbus_create_simple(OBJECT(machine), "virt-ctrl", TYPE_VIRT_CTRL,
+ VIRT_CTRL_MMIO_BASE,
PIC_GPIO(VIRT_CTRL_IRQ_BASE));
/* virtio-mmio */
io_base = VIRT_VIRTIO_MMIO_BASE;
for (i = 0; i < 128; i++) {
- dev = qdev_new_orphan(TYPE_VIRTIO_MMIO);
+ dev = qdev_new(OBJECT(machine), "virtio-mmio[*]", TYPE_VIRTIO_MMIO);
qdev_prop_set_bit(dev, "force-legacy", false);
sysbus = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
sysbus_connect_irq(sysbus, 0, PIC_GPIO(VIRT_VIRTIO_IRQ_BASE + i));
sysbus_mmio_map(sysbus, 0, io_base);
io_base += 0x200;
diff --git a/include/hw/m68k/mcf.h b/include/hw/m68k/mcf.h
index b2a599adaa..ff818c55d0 100644
--- a/include/hw/m68k/mcf.h
+++ b/include/hw/m68k/mcf.h
@@ -14,7 +14,7 @@ DeviceState *mcf_uart_create(qemu_irq irq, Chardev *chr);
DeviceState *mcf_uart_create_mmap(hwaddr base, qemu_irq irq, Chardev *chr);
/* mcf_intc.c */
-DeviceState *mcf_intc_init(struct MemoryRegion *sysmem,
+DeviceState *mcf_intc_init(Object *parent, struct MemoryRegion *sysmem,
hwaddr base, M68kCPU *cpu);
/* mcf5206.c */
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 045/134] hw/rtc: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (43 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 044/134] hw/m68k: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 046/134] hw/i2c: " Alexander Graf
` (89 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/rtc to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/rtc/mc146818rtc.c:933 | isa_new | parent | "rtc" | helper called from board init; thread Object *parent through mc146818_rtc_init() and its 4 callers (microvm, pnv, jazz, dp264)
hw/rtc/sun4v-rtc.c:60 | qdev_new | parent | "rtc" | helper called from niagara board init; thread Object *parent through sun4v_rtc_init()
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/alpha/dp264.c | 2 +-
hw/i386/microvm.c | 3 ++-
hw/mips/jazz.c | 2 +-
hw/ppc/pnv.c | 2 +-
hw/rtc/mc146818rtc.c | 6 +++---
hw/rtc/sun4v-rtc.c | 6 +++---
hw/sparc64/niagara.c | 2 +-
include/hw/rtc/mc146818rtc.h | 2 +-
include/hw/rtc/sun4v-rtc.h | 2 +-
9 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index 9cd448cff1..40dee88f2d 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -119,7 +119,7 @@ static void clipper_init(MachineState *machine)
qdev_connect_gpio_out(i82378_dev, 0, isa_irq);
/* Since we have an SRM-compatible PALcode, use the SRM epoch. */
- mc146818_rtc_init(isa_bus, 1900, rtc_irq);
+ mc146818_rtc_init(mo, isa_bus, 1900, rtc_irq);
/* VGA setup. Don't bother loading the bios. */
pci_vga_init(pci_bus);
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 16bd885541..d13036bd73 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -268,7 +268,8 @@ static void microvm_devices_init(MicrovmMachineState *mms)
if (mms->rtc == ON_OFF_AUTO_ON ||
(mms->rtc == ON_OFF_AUTO_AUTO && !kvm_enabled())) {
- microvm_set_rtc(mms, mc146818_rtc_init(isa_bus, 2000, NULL));
+ microvm_set_rtc(mms, mc146818_rtc_init(OBJECT(mms), isa_bus,
+ 2000, NULL));
}
if (mms->isa_serial) {
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index 62f2350d36..938aaf3fe1 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -354,7 +354,7 @@ static void mips_jazz_init(MachineState *machine,
fdctrl_init_sysbus(qdev_get_gpio_in(rc4030, 1), 0x80003000, fds);
/* Real time clock */
- mc146818_rtc_init(isa_bus, 1980, NULL);
+ mc146818_rtc_init(OBJECT(machine), isa_bus, 1980, NULL);
memory_region_init_io(rtc, NULL, &rtc_ops, NULL, "rtc", 0x1000);
memory_region_add_subregion(address_space, 0x80004000, rtc);
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 0a22d854d7..1eb3c09672 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1314,7 +1314,7 @@ static void pnv_init(MachineState *machine)
serial_hds_isa_init(pnv->isa_bus, 0, MAX_ISA_SERIAL_PORTS);
/* Create an RTC ISA device too */
- mc146818_rtc_init(pnv->isa_bus, 2000, NULL);
+ mc146818_rtc_init(OBJECT(machine), pnv->isa_bus, 2000, NULL);
/*
* Create the machine BMC simulator and the IPMI BT device for
diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
index b9e5ec6ff6..a4d6d59502 100644
--- a/hw/rtc/mc146818rtc.c
+++ b/hw/rtc/mc146818rtc.c
@@ -923,18 +923,18 @@ static void rtc_realizefn(DeviceState *dev, Error **errp)
qdev_init_gpio_out(dev, &s->irq, 1);
}
-MC146818RtcState *mc146818_rtc_init(ISABus *bus, int base_year,
+MC146818RtcState *mc146818_rtc_init(Object *parent, ISABus *bus, int base_year,
qemu_irq intercept_irq)
{
DeviceState *dev;
ISADevice *isadev;
MC146818RtcState *s;
- isadev = isa_new_orphan(TYPE_MC146818_RTC);
+ isadev = isa_new(parent, "rtc[*]", TYPE_MC146818_RTC);
dev = DEVICE(isadev);
s = MC146818_RTC(isadev);
qdev_prop_set_int32(dev, "base_year", base_year);
- isa_realize_and_unref(isadev, bus, &error_fatal);
+ qdev_realize(dev, BUS(bus), &error_fatal);
if (intercept_irq) {
qdev_connect_gpio_out(dev, 0, intercept_irq);
} else {
diff --git a/hw/rtc/sun4v-rtc.c b/hw/rtc/sun4v-rtc.c
index 257f70885d..ee07b7a979 100644
--- a/hw/rtc/sun4v-rtc.c
+++ b/hw/rtc/sun4v-rtc.c
@@ -52,15 +52,15 @@ static const MemoryRegionOps sun4v_rtc_ops = {
.endianness = DEVICE_BIG_ENDIAN,
};
-void sun4v_rtc_init(hwaddr addr)
+void sun4v_rtc_init(Object *parent, hwaddr addr)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan(TYPE_SUN4V_RTC);
+ dev = qdev_new(parent, "rtc", TYPE_SUN4V_RTC);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, addr);
}
diff --git a/hw/sparc64/niagara.c b/hw/sparc64/niagara.c
index 1211ecb82d..d47d62dac7 100644
--- a/hw/sparc64/niagara.c
+++ b/hw/sparc64/niagara.c
@@ -154,7 +154,7 @@ static void niagara_init(MachineState *machine)
serial_mm_init(sysmem, NIAGARA_UART_BASE, 0, NULL,
115200, serial_hd(0), DEVICE_BIG_ENDIAN);
create_unimplemented_device("sun4v-iob", NIAGARA_IOBBASE, NIAGARA_IOBSIZE);
- sun4v_rtc_init(NIAGARA_RTC_BASE);
+ sun4v_rtc_init(OBJECT(machine), NIAGARA_RTC_BASE);
}
static void niagara_class_init(ObjectClass *oc, const void *data)
diff --git a/include/hw/rtc/mc146818rtc.h b/include/hw/rtc/mc146818rtc.h
index 64893be151..1bdd63cf5c 100644
--- a/include/hw/rtc/mc146818rtc.h
+++ b/include/hw/rtc/mc146818rtc.h
@@ -51,7 +51,7 @@ struct MC146818RtcState {
#define RTC_ISA_IRQ 8
-MC146818RtcState *mc146818_rtc_init(ISABus *bus, int base_year,
+MC146818RtcState *mc146818_rtc_init(Object *parent, ISABus *bus, int base_year,
qemu_irq intercept_irq);
void mc146818rtc_set_cmos_data(MC146818RtcState *s, int addr, int val);
int mc146818rtc_get_cmos_data(MC146818RtcState *s, int addr);
diff --git a/include/hw/rtc/sun4v-rtc.h b/include/hw/rtc/sun4v-rtc.h
index 26a9eb6196..9152a0082f 100644
--- a/include/hw/rtc/sun4v-rtc.h
+++ b/include/hw/rtc/sun4v-rtc.h
@@ -14,6 +14,6 @@
#include "exec/hwaddr.h"
-void sun4v_rtc_init(hwaddr addr);
+void sun4v_rtc_init(Object *parent, hwaddr addr);
#endif
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 046/134] hw/i2c: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (44 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 045/134] hw/rtc: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 047/134] hw/block: " Alexander Graf
` (88 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/i2c to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/i2c/aspeed_i2c.c:1521 | i2c_slave_create_simple | OBJECT(s) | "slave" | inside AspeedI2CBus DeviceClass.realize(); slave belongs to the bus device
hw/i2c/core.c:367 | - | ORPHAN-JUSTIFIED | - | i2c_slave_new_orphan() is the orphan-API implementation itself; parented sibling already exists at :376
hw/i2c/core.c:371 | - | ORPHAN-JUSTIFIED | - | body of i2c_slave_new_orphan(); intentional orphan wrapper
hw/i2c/core.c:401 | - | ORPHAN-JUSTIFIED | - | i2c_slave_create_simple_orphan() is the orphan-API implementation itself; parented sibling already exists at :386
hw/i2c/core.c:403 | - | ORPHAN-JUSTIFIED | - | body of i2c_slave_create_simple_orphan(); intentional orphan wrapper
hw/i2c/smbus_eeprom.c:167 | qdev_new | parent | "eeprom[*]" | helper called from many board inits; thread Object *parent through smbus_eeprom_init_one() and smbus_eeprom_init() and update all 17 callers
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/aspeed_ast1040_evb.c | 3 ++-
hw/arm/aspeed_ast10x0_evb.c | 3 ++-
hw/arm/aspeed_ast2400_palmetto.c | 2 +-
hw/arm/aspeed_ast2400_supermicrox11.c | 2 +-
hw/arm/aspeed_ast2500_evb.c | 2 +-
hw/arm/aspeed_ast2500_g220a.c | 2 +-
hw/arm/aspeed_ast2500_supermicro-x11spi.c | 2 +-
hw/arm/aspeed_ast2500_witherspoon.c | 2 +-
hw/arm/aspeed_ast2600_evb.c | 2 +-
hw/i2c/aspeed_i2c.c | 4 ++--
hw/i2c/smbus_eeprom.c | 11 ++++++-----
hw/i386/pc_piix.c | 2 +-
hw/i386/pc_q35.c | 2 +-
hw/mips/fuloong2e.c | 2 +-
hw/mips/malta.c | 2 +-
hw/ppc/amigaone.c | 4 ++--
hw/ppc/pegasos.c | 2 +-
hw/ppc/sam460ex.c | 2 +-
include/hw/i2c/smbus_eeprom.h | 5 +++--
19 files changed, 30 insertions(+), 26 deletions(-)
diff --git a/hw/arm/aspeed_ast1040_evb.c b/hw/arm/aspeed_ast1040_evb.c
index d0326d39f9..fb83087b13 100644
--- a/hw/arm/aspeed_ast1040_evb.c
+++ b/hw/arm/aspeed_ast1040_evb.c
@@ -54,7 +54,8 @@ static void ast1040_evb_i2c_init(AspeedMachineState *bmc)
AspeedSoCState *soc = bmc->soc;
uint8_t *eeprom_buf = g_malloc0(256);
- smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
+ smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
+ eeprom_buf);
i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
}
diff --git a/hw/arm/aspeed_ast10x0_evb.c b/hw/arm/aspeed_ast10x0_evb.c
index 52ead37bc7..dc134b555c 100644
--- a/hw/arm/aspeed_ast10x0_evb.c
+++ b/hw/arm/aspeed_ast10x0_evb.c
@@ -70,7 +70,8 @@ static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
/* U10 24C08 connects to SDA/SCL Group 1 by default */
uint8_t *eeprom_buf = g_malloc0(32 * 1024);
- smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
+ smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
+ eeprom_buf);
/* U11 LM75 connects to SDA/SCL Group 2 by default */
i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
diff --git a/hw/arm/aspeed_ast2400_palmetto.c b/hw/arm/aspeed_ast2400_palmetto.c
index d89d042ce2..80f9c911b8 100644
--- a/hw/arm/aspeed_ast2400_palmetto.c
+++ b/hw/arm/aspeed_ast2400_palmetto.c
@@ -39,7 +39,7 @@ static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
*/
i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
- smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
+ smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
eeprom_buf);
/* add a TMP423 temperature sensor */
diff --git a/hw/arm/aspeed_ast2400_supermicrox11.c b/hw/arm/aspeed_ast2400_supermicrox11.c
index 9c90998754..b18adf3981 100644
--- a/hw/arm/aspeed_ast2400_supermicrox11.c
+++ b/hw/arm/aspeed_ast2400_supermicrox11.c
@@ -39,7 +39,7 @@ static void supermicrox11_bmc_i2c_init(AspeedMachineState *bmc)
*/
i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
- smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
+ smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
eeprom_buf);
/* add a TMP423 temperature sensor */
diff --git a/hw/arm/aspeed_ast2500_evb.c b/hw/arm/aspeed_ast2500_evb.c
index e46ce4a5aa..ba8a56bafd 100644
--- a/hw/arm/aspeed_ast2500_evb.c
+++ b/hw/arm/aspeed_ast2500_evb.c
@@ -30,7 +30,7 @@ static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
AspeedSoCState *soc = bmc->soc;
uint8_t *eeprom_buf = g_malloc0(8 * 1024);
- smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
+ smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
eeprom_buf);
/* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
diff --git a/hw/arm/aspeed_ast2500_g220a.c b/hw/arm/aspeed_ast2500_g220a.c
index 577ee0aff4..27c9dc436a 100644
--- a/hw/arm/aspeed_ast2500_g220a.c
+++ b/hw/arm/aspeed_ast2500_g220a.c
@@ -59,7 +59,7 @@ static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
0x46, 0x46, 0xc4, 0x48, 0x48, 0x47, 0x47, 0xc1,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
};
- smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
+ smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 4), 0x57,
eeprom_buf);
}
diff --git a/hw/arm/aspeed_ast2500_supermicro-x11spi.c b/hw/arm/aspeed_ast2500_supermicro-x11spi.c
index 9e95d26901..bea459eeaa 100644
--- a/hw/arm/aspeed_ast2500_supermicro-x11spi.c
+++ b/hw/arm/aspeed_ast2500_supermicro-x11spi.c
@@ -35,7 +35,7 @@ static void supermicro_x11spi_bmc_i2c_init(AspeedMachineState *bmc)
*/
i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
- smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
+ smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
eeprom_buf);
/* add a TMP423 temperature sensor */
diff --git a/hw/arm/aspeed_ast2500_witherspoon.c b/hw/arm/aspeed_ast2500_witherspoon.c
index cb57cb421a..dda090ab60 100644
--- a/hw/arm/aspeed_ast2500_witherspoon.c
+++ b/hw/arm/aspeed_ast2500_witherspoon.c
@@ -73,7 +73,7 @@ static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
*/
i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
- smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
+ smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
eeprom_buf);
dev = DEVICE(i2c_slave_new_orphan(TYPE_PCA9552, 0x60));
qdev_prop_set_string(dev, "description", "pca0");
diff --git a/hw/arm/aspeed_ast2600_evb.c b/hw/arm/aspeed_ast2600_evb.c
index cf1e2b006c..ab7667da75 100644
--- a/hw/arm/aspeed_ast2600_evb.c
+++ b/hw/arm/aspeed_ast2600_evb.c
@@ -23,7 +23,7 @@ static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
AspeedSoCState *soc = bmc->soc;
uint8_t *eeprom_buf = g_malloc0(8 * 1024);
- smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
+ smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
eeprom_buf);
/* LM75 is compatible with TMP105 driver */
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
index ac09e5f706..c58ecea011 100644
--- a/hw/i2c/aspeed_i2c.c
+++ b/hw/i2c/aspeed_i2c.c
@@ -1518,8 +1518,8 @@ static void aspeed_i2c_bus_realize(DeviceState *dev, Error **errp)
sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq);
s->bus = i2c_init_bus(dev, s->name);
- s->slave = i2c_slave_create_simple_orphan(s->bus, TYPE_ASPEED_I2C_BUS_SLAVE,
- 0xff);
+ s->slave = i2c_slave_create_simple(OBJECT(s), "slave", s->bus,
+ TYPE_ASPEED_I2C_BUS_SLAVE, 0xff);
memory_region_init_io(&s->mr, OBJECT(s), &aspeed_i2c_bus_ops,
s, s->name, aic->reg_size);
diff --git a/hw/i2c/smbus_eeprom.c b/hw/i2c/smbus_eeprom.c
index 59fe07b16b..aaf90a10da 100644
--- a/hw/i2c/smbus_eeprom.c
+++ b/hw/i2c/smbus_eeprom.c
@@ -160,18 +160,19 @@ static const TypeInfo smbus_eeprom_types[] = {
DEFINE_TYPES(smbus_eeprom_types)
-void smbus_eeprom_init_one(I2CBus *smbus, uint8_t address, uint8_t *eeprom_buf)
+void smbus_eeprom_init_one(Object *parent, I2CBus *smbus, uint8_t address,
+ uint8_t *eeprom_buf)
{
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_SMBUS_EEPROM);
+ dev = qdev_new(parent, "eeprom[*]", TYPE_SMBUS_EEPROM);
qdev_prop_set_uint8(dev, "address", address);
/* FIXME: use an array of byte or block backend property? */
SMBUS_EEPROM(dev)->init_data = eeprom_buf;
- qdev_realize_and_unref(dev, (BusState *)smbus, &error_fatal);
+ qdev_realize(dev, (BusState *)smbus, &error_fatal);
}
-void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom,
+void smbus_eeprom_init(Object *parent, I2CBus *smbus, int nb_eeprom,
const uint8_t *eeprom_spd, int eeprom_spd_size)
{
int i;
@@ -184,7 +185,7 @@ void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom,
}
for (i = 0; i < nb_eeprom; i++) {
- smbus_eeprom_init_one(smbus, 0x50 + i,
+ smbus_eeprom_init_one(parent, smbus, 0x50 + i,
eeprom_buf + (i * SMBUS_EEPROM_SIZE));
}
}
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 3f361c8396..44ce592ea2 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -304,7 +304,7 @@ static void pc_init1(MachineState *machine, const char *pci_type)
qdev_connect_gpio_out_named(DEVICE(piix4_pm), "smi-irq", 0, smi_irq);
pcms->smbus = I2C_BUS(qdev_get_child_bus(DEVICE(piix4_pm), "i2c"));
/* TODO: Populate SPD eeprom data. */
- smbus_eeprom_init(pcms->smbus, 8, NULL, 0);
+ smbus_eeprom_init(OBJECT(machine), pcms->smbus, 8, NULL, 0);
object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
TYPE_HOTPLUG_HANDLER,
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index a4a7169398..bfea390825 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -317,7 +317,7 @@ static void pc_q35_init(MachineState *machine)
TYPE_ICH9_SMB_DEVICE);
pcms->smbus = I2C_BUS(qdev_get_child_bus(DEVICE(smb), "i2c"));
- smbus_eeprom_init(pcms->smbus, 8, NULL, 0);
+ smbus_eeprom_init(OBJECT(machine), pcms->smbus, 8, NULL, 0);
}
/* the rest devices to which pci devfn is automatically assigned */
diff --git a/hw/mips/fuloong2e.c b/hw/mips/fuloong2e.c
index 5e5ade46f3..0046423d40 100644
--- a/hw/mips/fuloong2e.c
+++ b/hw/mips/fuloong2e.c
@@ -322,7 +322,7 @@ static void mips_fuloong2e_init(MachineState *machine)
/* Populate SPD eeprom data */
spd_data = spd_data_generate(DDR, machine->ram_size);
- smbus_eeprom_init_one(smbus, 0x50, spd_data);
+ smbus_eeprom_init_one(OBJECT(machine), smbus, 0x50, spd_data);
/* Network card: RTL8139D */
network_init(pci_bus);
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index da6dd15a59..52aae144da 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -1249,7 +1249,7 @@ void mips_malta_init(MachineState *machine)
smbus = I2C_BUS(qdev_get_child_bus(dev, "i2c"));
generate_eeprom_spd(&smbus_eeprom_buf[0 * 256], ram_size);
generate_eeprom_serial(&smbus_eeprom_buf[6 * 256]);
- smbus_eeprom_init(smbus, 8, smbus_eeprom_buf, smbus_eeprom_size);
+ smbus_eeprom_init(OBJECT(machine), smbus, 8, smbus_eeprom_buf, smbus_eeprom_size);
g_free(smbus_eeprom_buf);
/* Super I/O: SMS FDC37M817 */
diff --git a/hw/ppc/amigaone.c b/hw/ppc/amigaone.c
index 80802d42c6..866e5547d6 100644
--- a/hw/ppc/amigaone.c
+++ b/hw/ppc/amigaone.c
@@ -338,9 +338,9 @@ static void amigaone_init(MachineState *machine)
spd_data = spd_data_generate(SDR, machine->ram_size);
}
fix_spd_data(spd_data);
- smbus_eeprom_init_one(i2c_bus, 0x51, spd_data);
+ smbus_eeprom_init_one(OBJECT(machine), i2c_bus, 0x51, spd_data);
if (machine->ram_size > 512 * MiB) {
- smbus_eeprom_init_one(i2c_bus, 0x52, spd_data);
+ smbus_eeprom_init_one(OBJECT(machine), i2c_bus, 0x52, spd_data);
}
pci_mem = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1);
diff --git a/hw/ppc/pegasos.c b/hw/ppc/pegasos.c
index bba73f60c8..2974625f1c 100644
--- a/hw/ppc/pegasos.c
+++ b/hw/ppc/pegasos.c
@@ -261,7 +261,7 @@ static void pegasos_init(MachineState *machine)
dev = PCI_DEVICE(object_resolve_path_component(via, "pm"));
i2c_bus = I2C_BUS(qdev_get_child_bus(DEVICE(dev), "i2c"));
spd_data = spd_data_generate(DDR, machine->ram_size);
- smbus_eeprom_init_one(i2c_bus, 0x57, spd_data);
+ smbus_eeprom_init_one(OBJECT(machine), i2c_bus, 0x57, spd_data);
/* other PC hardware */
pci_vga_init(pci_bus);
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index d23d2c2bd8..8623848633 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -343,7 +343,7 @@ static void sam460ex_init(MachineState *machine)
spd_data = spd_data_generate(machine->ram_size < 128 * MiB ? DDR : DDR2,
machine->ram_size);
spd_data[20] = 4; /* SO-DIMM module */
- smbus_eeprom_init_one(i2c, 0x50, spd_data);
+ smbus_eeprom_init_one(OBJECT(machine), i2c, 0x50, spd_data);
/* RTC */
i2c_slave_create_simple_orphan(i2c, "m41t80", 0x68);
diff --git a/include/hw/i2c/smbus_eeprom.h b/include/hw/i2c/smbus_eeprom.h
index 61a54cda76..f3aefada42 100644
--- a/include/hw/i2c/smbus_eeprom.h
+++ b/include/hw/i2c/smbus_eeprom.h
@@ -26,8 +26,9 @@
#include "system/ram_addr.h"
#include "hw/i2c/i2c.h"
-void smbus_eeprom_init_one(I2CBus *bus, uint8_t address, uint8_t *eeprom_buf);
-void smbus_eeprom_init(I2CBus *bus, int nb_eeprom,
+void smbus_eeprom_init_one(Object *parent, I2CBus *bus, uint8_t address,
+ uint8_t *eeprom_buf);
+void smbus_eeprom_init(Object *parent, I2CBus *bus, int nb_eeprom,
const uint8_t *eeprom_spd, int size);
enum sdram_type { SDR = 0x4, DDR = 0x7, DDR2 = 0x8 };
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 047/134] hw/block: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (45 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 046/134] hw/i2c: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 048/134] hw/char: " Alexander Graf
` (87 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/block to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/block/fdc-sysbus.c:105 | qdev_new | parent | "fdc" | helper called from mips_jazz board init; thread Object *parent through fdctrl_init_sysbus()
hw/block/fdc-sysbus.c:121 | qdev_new | parent | "fdc" | helper called from sun4m board init; thread Object *parent through sun4m_fdctrl_init()
hw/block/fdc.c:2332 | qdev_new | OBJECT(bus->bus.parent) | "floppy[*]" | drive is child of the FDC device that owns the FloppyBus
hw/block/pflash_cfi01.c:961 | qdev_new | parent | name | helper already receives QOM name; thread Object *parent through pflash_cfi01_register() and its 9 board callers
hw/block/pflash_cfi02.c:1008 | qdev_new | parent | name | helper already receives QOM name; thread Object *parent through pflash_cfi02_register() and its 4 board callers
hw/block/xen-block.c:1077 | qdev_new_orphan | ORPHAN-JUSTIFIED | - | XenBackend .create() callback; hotplugged device analogous to qdev_device_add() path, parented later on realize into xenbus
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/collie.c | 2 +-
hw/arm/digic_boards.c | 2 +-
hw/arm/musicpal.c | 3 ++-
hw/arm/omap_sx1.c | 4 ++--
hw/arm/versatilepb.c | 2 +-
hw/arm/xilinx_zynq.c | 2 +-
hw/block/fdc-sysbus.c | 13 +++++++------
hw/block/fdc.c | 4 ++--
hw/block/pflash_cfi01.c | 6 +++---
hw/block/pflash_cfi02.c | 6 +++---
hw/microblaze/petalogix_ml605_mmu.c | 3 ++-
hw/microblaze/petalogix_s3adsp1800_mmu.c | 2 +-
hw/mips/jazz.c | 3 ++-
hw/mips/malta.c | 2 +-
hw/ppc/sam460ex.c | 7 ++++---
hw/ppc/virtex_ml507.c | 2 +-
hw/sh4/r2d.c | 2 +-
hw/sparc/sun4m.c | 2 +-
include/hw/block/fdc.h | 5 +++--
include/hw/block/flash.h | 4 ++--
20 files changed, 41 insertions(+), 35 deletions(-)
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
index 81bc019460..b3646daa3b 100644
--- a/hw/arm/collie.c
+++ b/hw/arm/collie.c
@@ -58,7 +58,7 @@ static void collie_init(MachineState *machine)
for (unsigned i = 0; i < 2; i++) {
DriveInfo *dinfo = drive_get(IF_PFLASH, 0, i);
- pflash_cfi01_register(i ? SA_CS1 : SA_CS0,
+ pflash_cfi01_register(OBJECT(machine), i ? SA_CS1 : SA_CS0,
i ? "collie.fl2" : "collie.fl1", FLASH_SIZE,
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
FLASH_SECTOR_SIZE, 4, 0x00, 0x00, 0x00, 0x00, 0);
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index ed12f54200..92b66f34f7 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -117,7 +117,7 @@ static void digic4_add_k8p3215uqb_rom(DigicState *s, hwaddr addr,
#define FLASH_K8P3215UQB_SIZE (4 * 1024 * 1024)
#define FLASH_K8P3215UQB_SECTOR_SIZE (64 * 1024)
- pflash_cfi02_register(addr, "pflash", FLASH_K8P3215UQB_SIZE,
+ pflash_cfi02_register(OBJECT(s), addr, "pflash", FLASH_K8P3215UQB_SIZE,
NULL, FLASH_K8P3215UQB_SECTOR_SIZE,
DIGIC4_ROM_MAX_SIZE / FLASH_K8P3215UQB_SIZE,
4,
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index a07359813e..43e15a4e48 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1279,7 +1279,8 @@ static void musicpal_init(MachineState *machine)
* 0xFF800000 (if there is 8 MB flash). So remap flash access if the
* image is smaller than 32 MB.
*/
- pflash_cfi02_register(0x100000000ULL - MP_FLASH_SIZE_MAX,
+ pflash_cfi02_register(OBJECT(machine),
+ 0x100000000ULL - MP_FLASH_SIZE_MAX,
"musicpal.flash", flash_size,
blk, FLASH_SECTOR_SIZE,
MP_FLASH_SIZE_MAX / flash_size,
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
index bcb7105323..a468b045d4 100644
--- a/hw/arm/omap_sx1.c
+++ b/hw/arm/omap_sx1.c
@@ -150,7 +150,7 @@ static void sx1_init(MachineState *machine, const int version)
fl_idx = 0;
if ((dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
- pflash_cfi01_register(OMAP_CS0_BASE,
+ pflash_cfi01_register(OBJECT(machine), OMAP_CS0_BASE,
"omap_sx1.flash0-1", flash_size,
blk_by_legacy_dinfo(dinfo),
SECTOR_SIZE, 4, 0, 0, 0, 0, 0);
@@ -169,7 +169,7 @@ static void sx1_init(MachineState *machine, const int version)
memory_region_add_subregion(address_space,
OMAP_CS1_BASE + FLASH1_SIZE, &cs[1]);
- pflash_cfi01_register(OMAP_CS1_BASE,
+ pflash_cfi01_register(OBJECT(machine), OMAP_CS1_BASE,
"omap_sx1.flash1-1", FLASH1_SIZE,
blk_by_legacy_dinfo(dinfo),
SECTOR_SIZE, 4, 0, 0, 0, 0, 0);
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index 5de99cb854..59bb2d1346 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -391,7 +391,7 @@ static void versatile_init(MachineState *machine, int board_id)
/* 0x34000000 NOR Flash */
dinfo = drive_get(IF_PFLASH, 0, 0);
- pflash_cfi01_register(VERSATILE_FLASH_ADDR, "versatile.flash",
+ pflash_cfi01_register(OBJECT(machine), VERSATILE_FLASH_ADDR, "versatile.flash",
VERSATILE_FLASH_SIZE,
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
VERSATILE_FLASH_SECT_SIZE,
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 7f31cd6088..ba00c5a3aa 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -242,7 +242,7 @@ static void zynq_init(MachineState *machine)
DriveInfo *dinfo = drive_get(IF_PFLASH, 0, 0);
/* AMD */
- pflash_cfi02_register(0xe2000000, "zynq.pflash", FLASH_SIZE,
+ pflash_cfi02_register(OBJECT(machine), 0xe2000000, "zynq.pflash", FLASH_SIZE,
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
FLASH_SECTOR_SIZE, 1,
1, 0x0066, 0x0022, 0x0000, 0x0000, 0x0555, 0x2aa,
diff --git a/hw/block/fdc-sysbus.c b/hw/block/fdc-sysbus.c
index 4050750e65..955abb9c4c 100644
--- a/hw/block/fdc-sysbus.c
+++ b/hw/block/fdc-sysbus.c
@@ -96,30 +96,31 @@ static void fdctrl_handle_tc(void *opaque, int irq, int level)
trace_fdctrl_tc_pulse(level);
}
-void fdctrl_init_sysbus(qemu_irq irq, hwaddr mmio_base, DriveInfo **fds)
+void fdctrl_init_sysbus(Object *parent, qemu_irq irq, hwaddr mmio_base,
+ DriveInfo **fds)
{
DeviceState *dev;
SysBusDevice *sbd;
FDCtrlSysBus *sys;
- dev = qdev_new_orphan("sysbus-fdc");
+ dev = qdev_new(parent, "fdc", "sysbus-fdc");
sys = SYSBUS_FDC(dev);
sbd = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
sysbus_connect_irq(sbd, 0, irq);
sysbus_mmio_map(sbd, 0, mmio_base);
fdctrl_init_drives(&sys->state.bus, fds);
}
-void sun4m_fdctrl_init(qemu_irq irq, hwaddr io_base,
+void sun4m_fdctrl_init(Object *parent, qemu_irq irq, hwaddr io_base,
DriveInfo **fds, qemu_irq *fdc_tc)
{
DeviceState *dev;
FDCtrlSysBus *sys;
- dev = qdev_new_orphan("sun-fdtwo");
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(parent, "fdc", "sun-fdtwo");
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sys = SYSBUS_FDC(dev);
sysbus_connect_irq(SYS_BUS_DEVICE(sys), 0, irq);
sysbus_mmio_map(SYS_BUS_DEVICE(sys), 0, io_base);
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index baac5f3c19..02508c79aa 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -2329,12 +2329,12 @@ void fdctrl_init_drives(FloppyBus *bus, DriveInfo **fds)
for (i = 0; i < MAX_FD; i++) {
if (fds[i]) {
- dev = qdev_new_orphan("floppy");
+ dev = qdev_new(OBJECT(bus->bus.parent), "floppy[*]", "floppy");
qdev_prop_set_uint32(dev, "unit", i);
qdev_prop_set_enum(dev, "drive-type", FLOPPY_DRIVE_TYPE_AUTO);
qdev_prop_set_drive_err(dev, "drive", blk_by_legacy_dinfo(fds[i]),
&error_fatal);
- qdev_realize_and_unref(dev, &bus->bus, &error_fatal);
+ qdev_realize(dev, &bus->bus, &error_fatal);
}
}
}
diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
index 0466682ca8..d584d7ea9f 100644
--- a/hw/block/pflash_cfi01.c
+++ b/hw/block/pflash_cfi01.c
@@ -948,7 +948,7 @@ static const TypeInfo pflash_cfi01_types[] = {
DEFINE_TYPES(pflash_cfi01_types)
-PFlashCFI01 *pflash_cfi01_register(hwaddr base,
+PFlashCFI01 *pflash_cfi01_register(Object *parent, hwaddr base,
const char *name,
hwaddr size,
BlockBackend *blk,
@@ -958,7 +958,7 @@ PFlashCFI01 *pflash_cfi01_register(hwaddr base,
uint16_t id2, uint16_t id3,
int be)
{
- DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new(parent, name, TYPE_PFLASH_CFI01);
if (blk) {
qdev_prop_set_drive(dev, "drive", blk);
@@ -973,7 +973,7 @@ PFlashCFI01 *pflash_cfi01_register(hwaddr base,
qdev_prop_set_uint16(dev, "id2", id2);
qdev_prop_set_uint16(dev, "id3", id3);
qdev_prop_set_string(dev, "name", name);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
return PFLASH_CFI01(dev);
diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c
index a22bdc5830..0dbd173be0 100644
--- a/hw/block/pflash_cfi02.c
+++ b/hw/block/pflash_cfi02.c
@@ -993,7 +993,7 @@ static void pflash_cfi02_register_types(void)
type_init(pflash_cfi02_register_types)
-PFlashCFI02 *pflash_cfi02_register(hwaddr base,
+PFlashCFI02 *pflash_cfi02_register(Object *parent, hwaddr base,
const char *name,
hwaddr size,
BlockBackend *blk,
@@ -1005,7 +1005,7 @@ PFlashCFI02 *pflash_cfi02_register(hwaddr base,
uint16_t unlock_addr1,
int be)
{
- DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI02);
+ DeviceState *dev = qdev_new(parent, name, TYPE_PFLASH_CFI02);
if (blk) {
qdev_prop_set_drive(dev, "drive", blk);
@@ -1023,7 +1023,7 @@ PFlashCFI02 *pflash_cfi02_register(hwaddr base,
qdev_prop_set_uint16(dev, "unlock-addr0", unlock_addr0);
qdev_prop_set_uint16(dev, "unlock-addr1", unlock_addr1);
qdev_prop_set_string(dev, "name", name);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
return PFLASH_CFI02(dev);
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index 031de37cec..b77df1132b 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -105,7 +105,8 @@ petalogix_ml605_init(MachineState *machine)
dinfo = drive_get(IF_PFLASH, 0, 0);
/* 5th parameter 2 means bank-width
* 10th parameter 0 means little-endian */
- pflash_cfi01_register(FLASH_BASEADDR, "petalogix_ml605.flash", FLASH_SIZE,
+ pflash_cfi01_register(OBJECT(machine), FLASH_BASEADDR,
+ "petalogix_ml605.flash", FLASH_SIZE,
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
64 * KiB, 2, 0x89, 0x18, 0x0000, 0x0, 0);
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index b4327ad493..0979d3632b 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -102,7 +102,7 @@ petalogix_s3adsp1800_init(MachineState *machine)
memory_region_add_subregion(sysmem, ddr_base, phys_ram);
dinfo = drive_get(IF_PFLASH, 0, 0);
- pflash_cfi01_register(FLASH_BASEADDR,
+ pflash_cfi01_register(OBJECT(machine), FLASH_BASEADDR,
"petalogix_s3adsp1800.flash", FLASH_SIZE,
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
64 * KiB, 1, 0x89, 0x18, 0x0000, 0x0, 1);
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index 938aaf3fe1..13eaa2d2ec 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -351,7 +351,8 @@ static void mips_jazz_init(MachineState *machine,
fds[n] = drive_get(IF_FLOPPY, 0, n);
}
/* FIXME: we should enable DMA with a custom IsaDma device */
- fdctrl_init_sysbus(qdev_get_gpio_in(rc4030, 1), 0x80003000, fds);
+ fdctrl_init_sysbus(OBJECT(machine), qdev_get_gpio_in(rc4030, 1),
+ 0x80003000, fds);
/* Real time clock */
mc146818_rtc_init(OBJECT(machine), isa_bus, 1980, NULL);
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index 52aae144da..8dc7429ac9 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -1137,7 +1137,7 @@ void mips_malta_init(MachineState *machine)
/* Load firmware in flash / BIOS. */
dinfo = drive_get(IF_PFLASH, 0, fl_idx);
- fl = pflash_cfi01_register(FLASH_ADDRESS, "mips_malta.bios",
+ fl = pflash_cfi01_register(OBJECT(machine), FLASH_ADDRESS, "mips_malta.bios",
FLASH_SIZE,
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
65536,
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 8623848633..41d4670fa8 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -83,7 +83,7 @@ struct boot_info {
uint32_t entry;
};
-static int sam460ex_load_uboot(void)
+static int sam460ex_load_uboot(Object *parent)
{
/*
* This first creates 1MiB of flash memory mapped at the end of
@@ -106,7 +106,8 @@ static int sam460ex_load_uboot(void)
DriveInfo *dinfo;
dinfo = drive_get(IF_PFLASH, 0, 0);
- if (!pflash_cfi01_register(FLASH_BASE | ((hwaddr)FLASH_BASE_H << 32),
+ if (!pflash_cfi01_register(parent,
+ FLASH_BASE | ((hwaddr)FLASH_BASE_H << 32),
"sam460ex.flash", FLASH_SIZE,
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
64 * KiB, 1, 0x89, 0x18, 0x0000, 0x0, 1)) {
@@ -459,7 +460,7 @@ static void sam460ex_init(MachineState *machine)
/* Load U-Boot image. */
if (!machine->kernel_filename) {
- success = sam460ex_load_uboot();
+ success = sam460ex_load_uboot(OBJECT(machine));
if (success < 0) {
error_report("could not load firmware");
exit(1);
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index 9163d8acf8..1379c168d3 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -213,7 +213,7 @@ static void virtex_init(MachineState *machine)
memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
dinfo = drive_get(IF_PFLASH, 0, 0);
- pflash_cfi01_register(PFLASH_BASEADDR, "virtex.flash", FLASH_SIZE,
+ pflash_cfi01_register(OBJECT(machine), PFLASH_BASEADDR, "virtex.flash", FLASH_SIZE,
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
64 * KiB, 1, 0x89, 0x18, 0x0000, 0x0, 1);
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index c0f8cad335..c03df91aca 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -309,7 +309,7 @@ static void r2d_init(MachineState *machine)
* addressable in words of 16bit.
*/
dinfo = drive_get(IF_PFLASH, 0, 0);
- pflash_cfi02_register(0x0, "r2d.flash", FLASH_SIZE,
+ pflash_cfi02_register(OBJECT(machine), 0x0, "r2d.flash", FLASH_SIZE,
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
64 * KiB, 1, 2, 0x0001, 0x227e, 0x2220, 0x2200,
0x555, 0x2aa, 0);
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index b0f018a3c5..144345d46a 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -1015,7 +1015,7 @@ static void sun4m_hw_init(MachineState *machine)
/* there is zero or one floppy drive */
memset(fd, 0, sizeof(fd));
fd[0] = drive_get(IF_FLOPPY, 0, 0);
- sun4m_fdctrl_init(slavio_irq[22], hwdef->fd_base, fd,
+ sun4m_fdctrl_init(OBJECT(machine), slavio_irq[22], hwdef->fd_base, fd,
&fdc_tc);
} else {
fdc_tc = qemu_allocate_irq(dummy_fdc_tc, NULL, 0);
diff --git a/include/hw/block/fdc.h b/include/hw/block/fdc.h
index c367c5efea..7ff6681835 100644
--- a/include/hw/block/fdc.h
+++ b/include/hw/block/fdc.h
@@ -10,8 +10,9 @@
#define TYPE_ISA_FDC "isa-fdc"
void isa_fdc_init_drives(ISADevice *fdc, DriveInfo **fds);
-void fdctrl_init_sysbus(qemu_irq irq, hwaddr mmio_base, DriveInfo **fds);
-void sun4m_fdctrl_init(qemu_irq irq, hwaddr io_base,
+void fdctrl_init_sysbus(Object *parent, qemu_irq irq, hwaddr mmio_base,
+ DriveInfo **fds);
+void sun4m_fdctrl_init(Object *parent, qemu_irq irq, hwaddr io_base,
DriveInfo **fds, qemu_irq *fdc_tc);
void isa_fdc_set_iobase(ISADevice *fdc, hwaddr iobase);
diff --git a/include/hw/block/flash.h b/include/hw/block/flash.h
index 3671f0174d..c005b707b2 100644
--- a/include/hw/block/flash.h
+++ b/include/hw/block/flash.h
@@ -12,7 +12,7 @@
OBJECT_DECLARE_SIMPLE_TYPE(PFlashCFI01, PFLASH_CFI01)
-PFlashCFI01 *pflash_cfi01_register(hwaddr base,
+PFlashCFI01 *pflash_cfi01_register(Object *parent, hwaddr base,
const char *name,
hwaddr size,
BlockBackend *blk,
@@ -31,7 +31,7 @@ void pflash_cfi01_legacy_drive(PFlashCFI01 *dev, DriveInfo *dinfo);
OBJECT_DECLARE_SIMPLE_TYPE(PFlashCFI02, PFLASH_CFI02)
-PFlashCFI02 *pflash_cfi02_register(hwaddr base,
+PFlashCFI02 *pflash_cfi02_register(Object *parent, hwaddr base,
const char *name,
hwaddr size,
BlockBackend *blk,
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 048/134] hw/char: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (46 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 047/134] hw/block: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 049/134] hw/isa: " Alexander Graf
` (86 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/char to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The public serial helpers serial_mm_init(), serial_hds_isa_init(),
parallel_hds_isa_init(), pl011_create(), sifive_uart_create(),
xilinx_uartlite_create() and mcf_uart_create*() gain a leading
Object *parent argument, threaded through from every board caller.
Per-site rationale (reviewers: dispute the modeling here):
hw/char/exynos4210_uart.c:662 | qdev_new | parent | "uart[*]" | helper called from Exynos4210 SoC realize; thread Object *parent
hw/char/mcf_uart.c:354 | qdev_new | parent | "uart[*]" | helper called from mcf5206 mbar realize and mcf5208 board init; thread Object *parent through mcf_uart_create() + mcf_uart_create_mmap()
hw/char/mchp_pfsoc_mmuart.c:153 | qdev_new | parent | "uart[*]" | helper called from PolarFire SoC realize; thread Object *parent; note site already uses sysbus_realize (no _and_unref) so leave as-is
hw/char/parallel-isa.c:25 | isa_new | parent | "parallel[*]" | static helper called from parallel_hds_isa_init(); thread Object *parent through both and update pc.c + sun4u.c callers
hw/char/pl011.c:41 | qdev_new | parent | "uart[*]" | helper called from many ARM board inits; thread Object *parent through pl011_create()
hw/char/serial-isa.c:168 | isa_new | parent | "serial[*]" | static helper called from serial_hds_isa_init(); thread Object *parent through both and update microvm/pc/pnv/sun4u callers
hw/char/serial-mm.c:102 | qdev_new | parent | "serial[*]" | very widely used helper; thread Object *parent through serial_mm_init() and update all 41 callers
hw/char/sifive_uart.c:402 | qdev_new | parent | "uart[*]" | helper called from SiFive E/U SoC realize; thread Object *parent
hw/char/spapr_vty.c:161 | qdev_new | parent | "vty[*]" | helper called from spapr_machine_init loop; thread Object *parent
hw/char/xen_console.c:565 | qdev_new_orphan | ORPHAN-JUSTIFIED | - | XenBackend .create() callback; hotplugged device analogous to qdev_device_add() path
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/allwinner-a10.c | 2 +-
hw/arm/allwinner-h3.c | 8 ++++----
hw/arm/allwinner-r40.c | 2 +-
hw/arm/exynos4210.c | 8 ++++----
hw/arm/integratorcp.c | 4 ++--
hw/arm/kzm.c | 2 +-
hw/arm/msf2-soc.c | 2 +-
hw/arm/musicpal.c | 4 ++--
hw/arm/npcm7xx.c | 2 +-
hw/arm/npcm8xx.c | 2 +-
hw/arm/omap1.c | 8 ++++----
hw/arm/omap_sx1.c | 2 +-
hw/arm/realview.c | 8 ++++----
hw/arm/versatilepb.c | 8 ++++----
hw/arm/vexpress.c | 8 ++++----
hw/char/exynos4210_uart.c | 6 +++---
hw/char/mcf_uart.c | 11 ++++++-----
hw/char/mchp_pfsoc_mmuart.c | 4 ++--
hw/char/omap_uart.c | 4 ++--
hw/char/parallel-isa.c | 10 +++++-----
hw/char/pl011.c | 6 +++---
hw/char/serial-isa.c | 11 ++++++-----
hw/char/serial-mm.c | 6 +++---
hw/char/sifive_uart.c | 8 ++++----
hw/char/spapr_vty.c | 6 +++---
hw/hppa/machine.c | 9 ++++++---
hw/i386/microvm.c | 2 +-
hw/i386/pc.c | 8 ++++----
hw/loongarch/virt.c | 2 +-
hw/m68k/mcf5206.c | 4 ++--
hw/m68k/mcf5208.c | 9 ++++++---
hw/microblaze/petalogix_ml605_mmu.c | 2 +-
hw/mips/boston.c | 3 ++-
hw/mips/jazz.c | 4 ++--
hw/mips/loongson3_virt.c | 2 +-
hw/mips/malta.c | 7 ++++---
hw/or1k/or1k-sim.c | 2 +-
hw/or1k/virt.c | 2 +-
hw/ppc/e500.c | 4 ++--
hw/ppc/pnv.c | 2 +-
hw/ppc/ppc440_bamboo.c | 4 ++--
hw/ppc/sam460ex.c | 4 ++--
hw/ppc/spapr.c | 2 +-
hw/ppc/virtex_ml507.c | 3 ++-
hw/riscv/boston-aia.c | 3 ++-
hw/riscv/k230.c | 8 ++++----
hw/riscv/microblaze-v-generic.c | 2 +-
hw/riscv/microchip_pfsoc.c | 10 +++++-----
hw/riscv/sifive_e.c | 4 ++--
hw/riscv/sifive_u.c | 4 ++--
hw/riscv/tt_atlantis.c | 2 +-
hw/riscv/virt.c | 2 +-
hw/riscv/xiangshan_kmh.c | 2 +-
hw/sparc64/niagara.c | 2 +-
hw/sparc64/sun4u.c | 6 +++---
hw/xtensa/xtfpga.c | 2 +-
include/hw/arm/exynos4210.h | 2 +-
include/hw/arm/omap.h | 4 ++--
include/hw/char/mchp_pfsoc_mmuart.h | 2 +-
include/hw/char/parallel.h | 2 +-
include/hw/char/pl011.h | 2 +-
include/hw/char/serial-isa.h | 2 +-
include/hw/char/serial-mm.h | 2 +-
include/hw/char/sifive_uart.h | 4 ++--
include/hw/m68k/mcf.h | 5 +++--
include/hw/ppc/spapr_vio.h | 2 +-
66 files changed, 152 insertions(+), 139 deletions(-)
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
index 66f30757dd..cbc0b38986 100644
--- a/hw/arm/allwinner-a10.c
+++ b/hw/arm/allwinner-a10.c
@@ -156,7 +156,7 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
sysbus_connect_irq(SYS_BUS_DEVICE(&s->sata), 0, qdev_get_gpio_in(dev, 56));
/* FIXME use a qdev chardev prop instead of serial_hd() */
- serial_mm_init(get_system_memory(), AW_A10_UART0_REG_BASE, 2,
+ serial_mm_init(OBJECT(s), get_system_memory(), AW_A10_UART0_REG_BASE, 2,
qdev_get_gpio_in(dev, 1),
115200, serial_hd(0), DEVICE_LITTLE_ENDIAN);
diff --git a/hw/arm/allwinner-h3.c b/hw/arm/allwinner-h3.c
index 427dbad7c3..ce716d1687 100644
--- a/hw/arm/allwinner-h3.c
+++ b/hw/arm/allwinner-h3.c
@@ -406,19 +406,19 @@ static void allwinner_h3_realize(DeviceState *dev, Error **errp)
AW_H3_GIC_SPI_OHCI3));
/* UART0. For future clocktree API: All UARTS are connected to APB2_CLK. */
- serial_mm_init(get_system_memory(), s->memmap[AW_H3_DEV_UART0], 2,
+ serial_mm_init(OBJECT(s), get_system_memory(), s->memmap[AW_H3_DEV_UART0], 2,
qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_UART0),
115200, serial_hd(0), DEVICE_LITTLE_ENDIAN);
/* UART1 */
- serial_mm_init(get_system_memory(), s->memmap[AW_H3_DEV_UART1], 2,
+ serial_mm_init(OBJECT(s), get_system_memory(), s->memmap[AW_H3_DEV_UART1], 2,
qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_UART1),
115200, serial_hd(1), DEVICE_LITTLE_ENDIAN);
/* UART2 */
- serial_mm_init(get_system_memory(), s->memmap[AW_H3_DEV_UART2], 2,
+ serial_mm_init(OBJECT(s), get_system_memory(), s->memmap[AW_H3_DEV_UART2], 2,
qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_UART2),
115200, serial_hd(2), DEVICE_LITTLE_ENDIAN);
/* UART3 */
- serial_mm_init(get_system_memory(), s->memmap[AW_H3_DEV_UART3], 2,
+ serial_mm_init(OBJECT(s), get_system_memory(), s->memmap[AW_H3_DEV_UART3], 2,
qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_UART3),
115200, serial_hd(3), DEVICE_LITTLE_ENDIAN);
diff --git a/hw/arm/allwinner-r40.c b/hw/arm/allwinner-r40.c
index a1ae75deb6..4f9d8a606e 100644
--- a/hw/arm/allwinner-r40.c
+++ b/hw/arm/allwinner-r40.c
@@ -489,7 +489,7 @@ static void allwinner_r40_realize(DeviceState *dev, Error **errp)
};
const hwaddr addr = s->memmap[AW_R40_DEV_UART0 + i];
- serial_mm_init(get_system_memory(), addr, 2,
+ serial_mm_init(OBJECT(s), get_system_memory(), addr, 2,
qdev_get_gpio_in(DEVICE(&s->gic), uart_irqs[i]),
115200, serial_hd(i), DEVICE_LITTLE_ENDIAN);
}
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
index 3199ea9cb7..7d9d87d7ba 100644
--- a/hw/arm/exynos4210.c
+++ b/hw/arm/exynos4210.c
@@ -723,19 +723,19 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
/*** UARTs ***/
- uart[0] = exynos4210_uart_create(EXYNOS4210_UART0_BASE_ADDR,
+ uart[0] = exynos4210_uart_create(OBJECT(s), EXYNOS4210_UART0_BASE_ADDR,
EXYNOS4210_UART0_FIFO_SIZE, 0, serial_hd(0),
s->irq_table[exynos4210_get_irq(EXYNOS4210_UART_INT_GRP, 0)]);
- uart[1] = exynos4210_uart_create(EXYNOS4210_UART1_BASE_ADDR,
+ uart[1] = exynos4210_uart_create(OBJECT(s), EXYNOS4210_UART1_BASE_ADDR,
EXYNOS4210_UART1_FIFO_SIZE, 1, serial_hd(1),
s->irq_table[exynos4210_get_irq(EXYNOS4210_UART_INT_GRP, 1)]);
- uart[2] = exynos4210_uart_create(EXYNOS4210_UART2_BASE_ADDR,
+ uart[2] = exynos4210_uart_create(OBJECT(s), EXYNOS4210_UART2_BASE_ADDR,
EXYNOS4210_UART2_FIFO_SIZE, 2, serial_hd(2),
s->irq_table[exynos4210_get_irq(EXYNOS4210_UART_INT_GRP, 2)]);
- uart[3] = exynos4210_uart_create(EXYNOS4210_UART3_BASE_ADDR,
+ uart[3] = exynos4210_uart_create(OBJECT(s), EXYNOS4210_UART3_BASE_ADDR,
EXYNOS4210_UART3_FIFO_SIZE, 3, serial_hd(3),
s->irq_table[exynos4210_get_irq(EXYNOS4210_UART_INT_GRP, 3)]);
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 163012a7bf..7560ad5983 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -637,8 +637,8 @@ static void integratorcp_init(MachineState *machine)
sysbus_create_varargs_orphan("integrator_pit", 0x13000000,
pic[5], pic[6], pic[7], NULL);
sysbus_create_simple_orphan("pl031", 0x15000000, pic[8]);
- pl011_create(0x16000000, pic[1], serial_hd(0));
- pl011_create(0x17000000, pic[2], serial_hd(1));
+ pl011_create(OBJECT(machine), 0x16000000, pic[1], serial_hd(0));
+ pl011_create(OBJECT(machine), 0x17000000, pic[2], serial_hd(1));
icp = sysbus_create_simple_orphan(TYPE_ICP_CONTROL_REGS, 0xcb000000,
qdev_get_gpio_in(sic, 3));
sysbus_create_simple_orphan("pl050_keyboard", 0x18000000, pic[3]);
diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index de9919c8cb..36e12bb362 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -120,7 +120,7 @@ static void kzm_init(MachineState *machine)
}
if (serial_hd(2)) { /* touchscreen */
- serial_mm_init(get_system_memory(), KZM_FPGA_ADDR+0x10, 0,
+ serial_mm_init(OBJECT(machine), get_system_memory(), KZM_FPGA_ADDR+0x10, 0,
qdev_get_gpio_in(DEVICE(&s->soc.avic), 52),
14745600, serial_hd(2), DEVICE_NATIVE_ENDIAN);
}
diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
index 27d77af9dc..76eba752bd 100644
--- a/hw/arm/msf2-soc.c
+++ b/hw/arm/msf2-soc.c
@@ -146,7 +146,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
for (i = 0; i < MSF2_NUM_UARTS; i++) {
if (serial_hd(i)) {
- serial_mm_init(get_system_memory(), uart_addr[i], 2,
+ serial_mm_init(OBJECT(s), get_system_memory(), uart_addr[i], 2,
qdev_get_gpio_in(armv7m, uart_irq[i]),
115200, serial_hd(i), DEVICE_NATIVE_ENDIAN);
}
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index 43e15a4e48..d9fe08d57b 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1255,10 +1255,10 @@ static void musicpal_init(MachineState *machine)
qdev_connect_gpio_out(uart_orgate, 0,
qdev_get_gpio_in(pic, MP_UART_SHARED_IRQ));
- serial_mm_init(address_space_mem, MP_UART1_BASE, 2,
+ serial_mm_init(OBJECT(machine), address_space_mem, MP_UART1_BASE, 2,
qdev_get_gpio_in(uart_orgate, 0),
1825000, serial_hd(0), DEVICE_NATIVE_ENDIAN);
- serial_mm_init(address_space_mem, MP_UART2_BASE, 2,
+ serial_mm_init(OBJECT(machine), address_space_mem, MP_UART2_BASE, 2,
qdev_get_gpio_in(uart_orgate, 1),
1825000, serial_hd(1), DEVICE_NATIVE_ENDIAN);
diff --git a/hw/arm/npcm7xx.c b/hw/arm/npcm7xx.c
index 87734c1cfb..8363a04f10 100644
--- a/hw/arm/npcm7xx.c
+++ b/hw/arm/npcm7xx.c
@@ -588,7 +588,7 @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
/* UART0..3 (16550 compatible) */
for (i = 0; i < ARRAY_SIZE(npcm7xx_uart_addr); i++) {
- serial_mm_init(get_system_memory(), npcm7xx_uart_addr[i], 2,
+ serial_mm_init(OBJECT(s), get_system_memory(), npcm7xx_uart_addr[i], 2,
npcm7xx_irq(s, NPCM7XX_UART0_IRQ + i), 115200,
serial_hd(i), DEVICE_LITTLE_ENDIAN);
}
diff --git a/hw/arm/npcm8xx.c b/hw/arm/npcm8xx.c
index 9ce6ea52d9..48fcc65a98 100644
--- a/hw/arm/npcm8xx.c
+++ b/hw/arm/npcm8xx.c
@@ -602,7 +602,7 @@ static void npcm8xx_realize(DeviceState *dev, Error **errp)
/* UART0..6 (16550 compatible) */
for (i = 0; i < ARRAY_SIZE(npcm8xx_uart_addr); i++) {
- serial_mm_init(get_system_memory(), npcm8xx_uart_addr[i], 2,
+ serial_mm_init(OBJECT(s), get_system_memory(), npcm8xx_uart_addr[i], 2,
npcm8xx_irq(s, NPCM8XX_UART0_IRQ + i), 115200,
serial_hd(i), DEVICE_LITTLE_ENDIAN);
}
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index eefa2e441a..c86914a464 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -3738,7 +3738,7 @@ static int omap_validate_tipb_mpui_addr(struct omap_mpu_state_s *s,
return range_covers_byte(0xe1010000, 0xe1020004 - 0xe1010000, addr);
}
-struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
+struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
const char *cpu_type)
{
int i;
@@ -3842,21 +3842,21 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
omap_tcmi_init(system_memory, 0xfffecc00, s);
- s->uart[0] = omap_uart_init(0xfffb0000,
+ s->uart[0] = omap_uart_init(parent, 0xfffb0000,
qdev_get_gpio_in(s->ih[1], OMAP_INT_UART1),
omap_findclk(s, "uart1_ck"),
omap_findclk(s, "uart1_ck"),
s->drq[OMAP_DMA_UART1_TX], s->drq[OMAP_DMA_UART1_RX],
"uart1",
serial_hd(0));
- s->uart[1] = omap_uart_init(0xfffb0800,
+ s->uart[1] = omap_uart_init(parent, 0xfffb0800,
qdev_get_gpio_in(s->ih[1], OMAP_INT_UART2),
omap_findclk(s, "uart2_ck"),
omap_findclk(s, "uart2_ck"),
s->drq[OMAP_DMA_UART2_TX], s->drq[OMAP_DMA_UART2_RX],
"uart2",
serial_hd(0) ? serial_hd(1) : NULL);
- s->uart[2] = omap_uart_init(0xfffb9800,
+ s->uart[2] = omap_uart_init(parent, 0xfffb9800,
qdev_get_gpio_in(s->ih[0], OMAP_INT_UART3),
omap_findclk(s, "uart3_ck"),
omap_findclk(s, "uart3_ck"),
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
index a468b045d4..1bd6c6d4bc 100644
--- a/hw/arm/omap_sx1.c
+++ b/hw/arm/omap_sx1.c
@@ -125,7 +125,7 @@ static void sx1_init(MachineState *machine, const int version)
memory_region_add_subregion(address_space, OMAP_EMIFF_BASE, machine->ram);
- mpu = omap310_mpu_init(machine->ram, machine->cpu_type);
+ mpu = omap310_mpu_init(OBJECT(machine), machine->ram, machine->cpu_type);
/* External Flash (EMIFS) */
memory_region_init_rom(flash, NULL, "omap_sx1.flash0-0", flash_size,
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index f51730c487..965fef4fcf 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -224,10 +224,10 @@ static void realview_init(MachineState *machine,
sysbus_create_simple_orphan("pl050_keyboard", 0x10006000, pic[20]);
sysbus_create_simple_orphan("pl050_mouse", 0x10007000, pic[21]);
- pl011_create(0x10009000, pic[12], serial_hd(0));
- pl011_create(0x1000a000, pic[13], serial_hd(1));
- pl011_create(0x1000b000, pic[14], serial_hd(2));
- pl011_create(0x1000c000, pic[15], serial_hd(3));
+ pl011_create(OBJECT(machine), 0x10009000, pic[12], serial_hd(0));
+ pl011_create(OBJECT(machine), 0x1000a000, pic[13], serial_hd(1));
+ pl011_create(OBJECT(machine), 0x1000b000, pic[14], serial_hd(2));
+ pl011_create(OBJECT(machine), 0x1000c000, pic[15], serial_hd(3));
/* DMA controller is optional, apparently. */
dev = qdev_new_orphan("pl081");
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index 59bb2d1346..6fb7223265 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -279,10 +279,10 @@ static void versatile_init(MachineState *machine, int board_id)
n--;
}
- pl011_create(0x101f1000, pic[12], serial_hd(0));
- pl011_create(0x101f2000, pic[13], serial_hd(1));
- pl011_create(0x101f3000, pic[14], serial_hd(2));
- pl011_create(0x10009000, sic[6], serial_hd(3));
+ pl011_create(OBJECT(machine), 0x101f1000, pic[12], serial_hd(0));
+ pl011_create(OBJECT(machine), 0x101f2000, pic[13], serial_hd(1));
+ pl011_create(OBJECT(machine), 0x101f3000, pic[14], serial_hd(2));
+ pl011_create(OBJECT(machine), 0x10009000, sic[6], serial_hd(3));
dev = qdev_new_orphan("pl080");
object_property_set_link(OBJECT(dev), "downstream", OBJECT(sysmem),
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index 5cbb2c44cb..7c5a69b5a9 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -643,10 +643,10 @@ static void vexpress_common_init(MachineState *machine)
sysbus_create_simple_orphan("pl050_keyboard", map[VE_KMI0], pic[12]);
sysbus_create_simple_orphan("pl050_mouse", map[VE_KMI1], pic[13]);
- pl011_create(map[VE_UART0], pic[5], serial_hd(0));
- pl011_create(map[VE_UART1], pic[6], serial_hd(1));
- pl011_create(map[VE_UART2], pic[7], serial_hd(2));
- pl011_create(map[VE_UART3], pic[8], serial_hd(3));
+ pl011_create(OBJECT(machine), map[VE_UART0], pic[5], serial_hd(0));
+ pl011_create(OBJECT(machine), map[VE_UART1], pic[6], serial_hd(1));
+ pl011_create(OBJECT(machine), map[VE_UART2], pic[7], serial_hd(2));
+ pl011_create(OBJECT(machine), map[VE_UART3], pic[8], serial_hd(3));
sysbus_create_simple_orphan("sp804", map[VE_TIMER01], pic[2]);
sysbus_create_simple_orphan("sp804", map[VE_TIMER23], pic[3]);
diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c
index 6bc18851d9..dee0ecb4d7 100644
--- a/hw/char/exynos4210_uart.c
+++ b/hw/char/exynos4210_uart.c
@@ -650,7 +650,7 @@ static const VMStateDescription vmstate_exynos4210_uart = {
}
};
-DeviceState *exynos4210_uart_create(hwaddr addr,
+DeviceState *exynos4210_uart_create(Object *parent, hwaddr addr,
int fifo_size,
int channel,
Chardev *chr,
@@ -659,7 +659,7 @@ DeviceState *exynos4210_uart_create(hwaddr addr,
DeviceState *dev;
SysBusDevice *bus;
- dev = qdev_new_orphan(TYPE_EXYNOS4210_UART);
+ dev = qdev_new(parent, "uart[*]", TYPE_EXYNOS4210_UART);
qdev_prop_set_chr(dev, "chardev", chr);
qdev_prop_set_uint32(dev, "channel", channel);
@@ -667,7 +667,7 @@ DeviceState *exynos4210_uart_create(hwaddr addr,
qdev_prop_set_uint32(dev, "tx-size", fifo_size);
bus = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(bus, &error_fatal);
+ sysbus_realize(bus, &error_fatal);
if (addr != (hwaddr)-1) {
sysbus_mmio_map(bus, 0, addr);
}
diff --git a/hw/char/mcf_uart.c b/hw/char/mcf_uart.c
index f4fc47364e..2c5bfa6b67 100644
--- a/hw/char/mcf_uart.c
+++ b/hw/char/mcf_uart.c
@@ -347,25 +347,26 @@ static void mcf_uart_register(void)
type_init(mcf_uart_register)
-DeviceState *mcf_uart_create(qemu_irq irq, Chardev *chrdrv)
+DeviceState *mcf_uart_create(Object *parent, qemu_irq irq, Chardev *chrdrv)
{
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_MCF_UART);
+ dev = qdev_new(parent, "uart[*]", TYPE_MCF_UART);
if (chrdrv) {
qdev_prop_set_chr(dev, "chardev", chrdrv);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq);
return dev;
}
-DeviceState *mcf_uart_create_mmap(hwaddr base, qemu_irq irq, Chardev *chrdrv)
+DeviceState *mcf_uart_create_mmap(Object *parent, hwaddr base, qemu_irq irq,
+ Chardev *chrdrv)
{
DeviceState *dev;
- dev = mcf_uart_create(irq, chrdrv);
+ dev = mcf_uart_create(parent, irq, chrdrv);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
return dev;
diff --git a/hw/char/mchp_pfsoc_mmuart.c b/hw/char/mchp_pfsoc_mmuart.c
index 1a6d736f56..fb8ee96b1f 100644
--- a/hw/char/mchp_pfsoc_mmuart.c
+++ b/hw/char/mchp_pfsoc_mmuart.c
@@ -146,11 +146,11 @@ static void mchp_pfsoc_mmuart_register_types(void)
type_init(mchp_pfsoc_mmuart_register_types)
-MchpPfSoCMMUartState *mchp_pfsoc_mmuart_create(MemoryRegion *sysmem,
+MchpPfSoCMMUartState *mchp_pfsoc_mmuart_create(Object *parent, MemoryRegion *sysmem,
hwaddr base,
qemu_irq irq, Chardev *chr)
{
- DeviceState *dev = qdev_new_orphan(TYPE_MCHP_PFSOC_UART);
+ DeviceState *dev = qdev_new(parent, "uart[*]", TYPE_MCHP_PFSOC_UART);
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", chr);
diff --git a/hw/char/omap_uart.c b/hw/char/omap_uart.c
index 8cbf6ce803..4c7922a435 100644
--- a/hw/char/omap_uart.c
+++ b/hw/char/omap_uart.c
@@ -47,7 +47,7 @@ void omap_uart_reset(struct omap_uart_s *s)
s->clksel = 0;
}
-struct omap_uart_s *omap_uart_init(hwaddr base,
+struct omap_uart_s *omap_uart_init(Object *parent, hwaddr base,
qemu_irq irq, omap_clk fclk, omap_clk iclk,
qemu_irq txdma, qemu_irq rxdma,
const char *label, Chardev *chr)
@@ -57,7 +57,7 @@ struct omap_uart_s *omap_uart_init(hwaddr base,
s->base = base;
s->fclk = fclk;
s->irq = irq;
- s->serial = serial_mm_init(get_system_memory(), base, 2, irq,
+ s->serial = serial_mm_init(parent, get_system_memory(), base, 2, irq,
omap_clk_getrate(fclk) / 16,
chr ?: qemu_chr_new(label, "null", NULL),
DEVICE_NATIVE_ENDIAN);
diff --git a/hw/char/parallel-isa.c b/hw/char/parallel-isa.c
index 19583c0f23..758aa58017 100644
--- a/hw/char/parallel-isa.c
+++ b/hw/char/parallel-isa.c
@@ -17,19 +17,19 @@
#include "hw/char/parallel.h"
#include "qapi/error.h"
-static void parallel_init(ISABus *bus, int index, Chardev *chr)
+static void parallel_init(Object *parent, ISABus *bus, int index, Chardev *chr)
{
DeviceState *dev;
ISADevice *isadev;
- isadev = isa_new_orphan(TYPE_ISA_PARALLEL);
+ isadev = isa_new(parent, "parallel[*]", TYPE_ISA_PARALLEL);
dev = DEVICE(isadev);
qdev_prop_set_uint32(dev, "index", index);
qdev_prop_set_chr(dev, "chardev", chr);
- isa_realize_and_unref(isadev, bus, &error_fatal);
+ qdev_realize(dev, BUS(bus), &error_fatal);
}
-void parallel_hds_isa_init(ISABus *bus, int n)
+void parallel_hds_isa_init(Object *parent, ISABus *bus, int n)
{
int i;
@@ -37,7 +37,7 @@ void parallel_hds_isa_init(ISABus *bus, int n)
for (i = 0; i < n; i++) {
if (parallel_hds[i]) {
- parallel_init(bus, i, parallel_hds[i]);
+ parallel_init(parent, bus, i, parallel_hds[i]);
}
}
}
diff --git a/hw/char/pl011.c b/hw/char/pl011.c
index c8adf964ca..d3227f1df8 100644
--- a/hw/char/pl011.c
+++ b/hw/char/pl011.c
@@ -33,15 +33,15 @@
#include "qemu/module.h"
#include "trace.h"
-DeviceState *pl011_create(hwaddr addr, qemu_irq irq, Chardev *chr)
+DeviceState *pl011_create(Object *parent, hwaddr addr, qemu_irq irq, Chardev *chr)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan("pl011");
+ dev = qdev_new(parent, "uart[*]", "pl011");
s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", chr);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, addr);
sysbus_connect_irq(s, 0, irq);
diff --git a/hw/char/serial-isa.c b/hw/char/serial-isa.c
index 4dbdc0df91..4fae200e70 100644
--- a/hw/char/serial-isa.c
+++ b/hw/char/serial-isa.c
@@ -160,19 +160,20 @@ static void serial_register_types(void)
type_init(serial_register_types)
-static void serial_isa_init(ISABus *bus, int index, Chardev *chr)
+static void serial_isa_init(Object *parent, ISABus *bus, int index,
+ Chardev *chr)
{
DeviceState *dev;
ISADevice *isadev;
- isadev = isa_new_orphan(TYPE_ISA_SERIAL);
+ isadev = isa_new(parent, "serial[*]", TYPE_ISA_SERIAL);
dev = DEVICE(isadev);
qdev_prop_set_uint32(dev, "index", index);
qdev_prop_set_chr(dev, "chardev", chr);
- isa_realize_and_unref(isadev, bus, &error_fatal);
+ qdev_realize(dev, BUS(bus), &error_fatal);
}
-void serial_hds_isa_init(ISABus *bus, int from, int to)
+void serial_hds_isa_init(Object *parent, ISABus *bus, int from, int to)
{
int i;
@@ -181,7 +182,7 @@ void serial_hds_isa_init(ISABus *bus, int from, int to)
for (i = from; i < to; ++i) {
if (serial_hd(i)) {
- serial_isa_init(bus, i, serial_hd(i));
+ serial_isa_init(parent, bus, i, serial_hd(i));
}
}
}
diff --git a/hw/char/serial-mm.c b/hw/char/serial-mm.c
index cd0844c450..bf853bb762 100644
--- a/hw/char/serial-mm.c
+++ b/hw/char/serial-mm.c
@@ -94,12 +94,12 @@ static const VMStateDescription vmstate_serial_mm = {
}
};
-SerialMM *serial_mm_init(MemoryRegion *address_space,
+SerialMM *serial_mm_init(Object *parent, MemoryRegion *address_space,
hwaddr base, int regshift,
qemu_irq irq, int baudbase,
Chardev *chr, enum device_endian end)
{
- SerialMM *smm = SERIAL_MM(qdev_new_orphan(TYPE_SERIAL_MM));
+ SerialMM *smm = SERIAL_MM(qdev_new(parent, "serial[*]", TYPE_SERIAL_MM));
MemoryRegion *mr;
qdev_prop_set_uint8(DEVICE(smm), "regshift", regshift);
@@ -107,7 +107,7 @@ SerialMM *serial_mm_init(MemoryRegion *address_space,
qdev_prop_set_chr(DEVICE(smm), "chardev", chr);
qdev_set_legacy_instance_id(DEVICE(smm), base, 2);
qdev_prop_set_uint8(DEVICE(smm), "endianness", end);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(smm), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(smm), &error_fatal);
sysbus_connect_irq(SYS_BUS_DEVICE(smm), 0, irq);
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(smm), 0);
diff --git a/hw/char/sifive_uart.c b/hw/char/sifive_uart.c
index 1613a975e0..7a35990c33 100644
--- a/hw/char/sifive_uart.c
+++ b/hw/char/sifive_uart.c
@@ -393,16 +393,16 @@ type_init(sifive_uart_register_types)
/*
* Create UART device.
*/
-SiFiveUARTState *sifive_uart_create(MemoryRegion *address_space, hwaddr base,
- Chardev *chr, qemu_irq irq)
+SiFiveUARTState *sifive_uart_create(Object *parent, MemoryRegion *address_space,
+ hwaddr base, Chardev *chr, qemu_irq irq)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan("riscv.sifive.uart");
+ dev = qdev_new(parent, "uart[*]", "riscv.sifive.uart");
s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", chr);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
memory_region_add_subregion(address_space, base,
sysbus_mmio_get_region(s, 0));
sysbus_connect_irq(s, 0, irq);
diff --git a/hw/char/spapr_vty.c b/hw/char/spapr_vty.c
index a331d4be3b..a5bf6aa851 100644
--- a/hw/char/spapr_vty.c
+++ b/hw/char/spapr_vty.c
@@ -154,13 +154,13 @@ static target_ulong h_get_term_char(PowerPCCPU *cpu, SpaprMachineState *spapr,
return H_SUCCESS;
}
-void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev)
+void spapr_vty_create(Object *parent, SpaprVioBus *bus, Chardev *chardev)
{
DeviceState *dev;
- dev = qdev_new_orphan("spapr-vty");
+ dev = qdev_new(parent, "vty[*]", "spapr-vty");
qdev_prop_set_chr(dev, "chardev", chardev);
- qdev_realize_and_unref(dev, &bus->bus, &error_fatal);
+ qdev_realize(dev, &bus->bus, &error_fatal);
}
static const Property spapr_vty_properties[] = {
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index e3c9053bf2..002f4299cc 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -607,7 +607,8 @@ static void machine_HP_715_init(MachineState *machine)
SYS_BUS_DEVICE(lasi_dev), 0));
/* Serial ports: Lasi use a 7.272727 MHz clock. */
- serial_mm_init(addr_space, translate(NULL, LASI_HPA_715 + LASI_UART + 0x800), 0,
+ serial_mm_init(OBJECT(machine), addr_space,
+ translate(NULL, LASI_HPA_715 + LASI_UART + 0x800), 0,
qdev_get_gpio_in(lasi_dev, LASI_IRQ_UART_HPA), 7272727 / 16,
serial_hd(0), DEVICE_BIG_ENDIAN);
@@ -694,11 +695,13 @@ static void machine_HP_B160L_init(MachineState *machine)
assert(isa_bus);
/* Serial ports: Lasi and Dino use a 7.272727 MHz clock. */
- serial_mm_init(addr_space, translate(NULL, LASI_HPA + LASI_UART + 0x800), 0,
+ serial_mm_init(OBJECT(machine), addr_space,
+ translate(NULL, LASI_HPA + LASI_UART + 0x800), 0,
qdev_get_gpio_in(lasi_dev, LASI_IRQ_UART_HPA), 7272727 / 16,
serial_hd(0), DEVICE_BIG_ENDIAN);
- serial_mm_init(addr_space, translate(NULL, DINO_UART_HPA + 0x800), 0,
+ serial_mm_init(OBJECT(machine), addr_space,
+ translate(NULL, DINO_UART_HPA + 0x800), 0,
qdev_get_gpio_in(dino_dev, DINO_IRQ_RS232INT), 7272727 / 16,
serial_hd(1), DEVICE_BIG_ENDIAN);
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index d13036bd73..8e52cdd0db 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -273,7 +273,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
}
if (mms->isa_serial) {
- serial_hds_isa_init(isa_bus, 0, 1);
+ serial_hds_isa_init(OBJECT(mms), isa_bus, 0, 1);
}
if (!x86ms->igvm) {
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 24ba1189d7..3d405cb33c 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -981,7 +981,7 @@ static const MemoryRegionOps ioportF0_io_ops = {
},
};
-static void pc_superio_init(ISABus *isa_bus, bool create_fdctrl,
+static void pc_superio_init(Object *parent, ISABus *isa_bus, bool create_fdctrl,
bool create_i8042, bool no_vmport, Error **errp)
{
int i;
@@ -989,8 +989,8 @@ static void pc_superio_init(ISABus *isa_bus, bool create_fdctrl,
qemu_irq *a20_line;
ISADevice *i8042, *port92, *vmmouse;
- serial_hds_isa_init(isa_bus, 0, MAX_ISA_SERIAL_PORTS);
- parallel_hds_isa_init(isa_bus, MAX_PARALLEL_PORTS);
+ serial_hds_isa_init(parent, isa_bus, 0, MAX_ISA_SERIAL_PORTS);
+ parallel_hds_isa_init(parent, isa_bus, MAX_PARALLEL_PORTS);
for (i = 0; i < MAX_FD; i++) {
fd[i] = drive_get(IF_FLOPPY, 0, i);
@@ -1136,7 +1136,7 @@ void pc_basic_device_init(struct PCMachineState *pcms,
}
/* Super I/O */
- pc_superio_init(isa_bus, create_fdctrl, pcms->i8042_enabled,
+ pc_superio_init(OBJECT(pcms), isa_bus, create_fdctrl, pcms->i8042_enabled,
pcms->vmport != ON_OFF_AUTO_ON, &error_fatal);
pcms->machine_done.notify = pc_machine_done;
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 6ba693874f..7d1d4c7657 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -471,7 +471,7 @@ static void virt_devices_init(DeviceState *pch_pic,
for (i = VIRT_UART_COUNT; i-- > 0;) {
hwaddr base = VIRT_UART_BASE + i * VIRT_UART_SIZE;
irq = VIRT_UART_IRQ + i - VIRT_GSI_BASE;
- serial_mm_init(get_system_memory(), base, 0,
+ serial_mm_init(OBJECT(lvms), get_system_memory(), base, 0,
qdev_get_gpio_in(pch_pic, irq),
115200, serial_hd(i), DEVICE_LITTLE_ENDIAN);
}
diff --git a/hw/m68k/mcf5206.c b/hw/m68k/mcf5206.c
index 9f373b99b1..b3c745d3f9 100644
--- a/hw/m68k/mcf5206.c
+++ b/hw/m68k/mcf5206.c
@@ -596,8 +596,8 @@ static void mcf5206_mbar_realize(DeviceState *dev, Error **errp)
s->pic = qemu_allocate_irqs(m5206_mbar_set_irq, s, 14);
m5206_timer_init(&s->timer[0], s->pic[9]);
m5206_timer_init(&s->timer[1], s->pic[10]);
- s->uart[0] = mcf_uart_create(s->pic[12], serial_hd(0));
- s->uart[1] = mcf_uart_create(s->pic[13], serial_hd(1));
+ s->uart[0] = mcf_uart_create(OBJECT(s), s->pic[12], serial_hd(0));
+ s->uart[1] = mcf_uart_create(OBJECT(s), s->pic[13], serial_hd(1));
}
static const Property mcf5206_mbar_properties[] = {
diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
index 0b8636daa9..f305478b8d 100644
--- a/hw/m68k/mcf5208.c
+++ b/hw/m68k/mcf5208.c
@@ -309,9 +309,12 @@ static void mcf5208evb_init(MachineState *machine)
/* Internal peripherals. */
intc = mcf_intc_init(OBJECT(machine), address_space_mem, 0xfc048000, cpu);
- mcf_uart_create_mmap(0xfc060000, qdev_get_gpio_in(intc, 26), serial_hd(0));
- mcf_uart_create_mmap(0xfc064000, qdev_get_gpio_in(intc, 27), serial_hd(1));
- mcf_uart_create_mmap(0xfc068000, qdev_get_gpio_in(intc, 28), serial_hd(2));
+ mcf_uart_create_mmap(OBJECT(machine), 0xfc060000,
+ qdev_get_gpio_in(intc, 26), serial_hd(0));
+ mcf_uart_create_mmap(OBJECT(machine), 0xfc064000,
+ qdev_get_gpio_in(intc, 27), serial_hd(1));
+ mcf_uart_create_mmap(OBJECT(machine), 0xfc068000,
+ qdev_get_gpio_in(intc, 28), serial_hd(2));
mcf5208_sys_init(address_space_mem, intc, cpu);
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index b77df1132b..1dc34dc247 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -122,7 +122,7 @@ petalogix_ml605_init(MachineState *machine)
irq[i] = qdev_get_gpio_in(dev, i);
}
- serial_mm_init(address_space_mem, UART16550_BASEADDR + 0x1000, 2,
+ serial_mm_init(OBJECT(machine), address_space_mem, UART16550_BASEADDR + 0x1000, 2,
irq[UART16550_IRQ], 115200, serial_hd(0),
DEVICE_LITTLE_ENDIAN);
diff --git a/hw/mips/boston.c b/hw/mips/boston.c
index 18ede54ae8..770160c4e5 100644
--- a/hw/mips/boston.c
+++ b/hw/mips/boston.c
@@ -755,7 +755,8 @@ static void boston_mach_init(MachineState *machine)
memory_region_add_subregion_overlap(sys_mem,
boston_memmap[BOSTON_PLATREG].base, platreg, 0);
- s->uart = serial_mm_init(sys_mem, boston_memmap[BOSTON_UART].base, 2,
+ s->uart = serial_mm_init(OBJECT(machine), sys_mem,
+ boston_memmap[BOSTON_UART].base, 2,
get_cps_irq(&s->cps, 3), 10000000,
serial_hd(0), DEVICE_LITTLE_ENDIAN);
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index 13eaa2d2ec..31ef357554 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -375,10 +375,10 @@ static void mips_jazz_init(MachineState *machine,
0));
/* Serial ports */
- serial_mm_init(address_space, 0x80006000, 0,
+ serial_mm_init(OBJECT(machine), address_space, 0x80006000, 0,
qdev_get_gpio_in(rc4030, 8), 8000000 / 16,
serial_hd(0), DEVICE_NATIVE_ENDIAN);
- serial_mm_init(address_space, 0x80007000, 0,
+ serial_mm_init(OBJECT(machine), address_space, 0x80007000, 0,
qdev_get_gpio_in(rc4030, 9), 8000000 / 16,
serial_hd(1), DEVICE_NATIVE_ENDIAN);
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index f43c231004..6f2ac8ba90 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -532,7 +532,7 @@ static void mips_loongson3_virt_init(MachineState *machine)
sysbus_mmio_map(SYS_BUS_DEVICE(liointc), 0, virt_memmap[VIRT_LIOINTC].base);
- serial_mm_init(address_space_mem, virt_memmap[VIRT_UART].base, 0,
+ serial_mm_init(OBJECT(machine), address_space_mem, virt_memmap[VIRT_UART].base, 0,
qdev_get_gpio_in(liointc, UART_IRQ), 115200, serial_hd(0),
DEVICE_LITTLE_ENDIAN);
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index 8dc7429ac9..ea11299af8 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -569,7 +569,7 @@ static void malta_fgpa_display_event(void *opaque, QEMUChrEvent event)
}
}
-static MaltaFPGAState *malta_fpga_init(MemoryRegion *address_space,
+static MaltaFPGAState *malta_fpga_init(Object *parent, MemoryRegion *address_space,
hwaddr base, qemu_irq uart_irq, Chardev *uart_chr)
{
MaltaFPGAState *s;
@@ -592,7 +592,7 @@ static MaltaFPGAState *malta_fpga_init(MemoryRegion *address_space,
qemu_chr_fe_set_handlers(&s->display, NULL, NULL,
malta_fgpa_display_event, NULL, s, NULL, true);
- s->uart = serial_mm_init(address_space, base + 0x900, 3, uart_irq,
+ s->uart = serial_mm_init(parent, address_space, base + 0x900, 3, uart_irq,
230400, uart_chr, DEVICE_NATIVE_ENDIAN);
malta_fpga_reset(s);
@@ -1133,7 +1133,8 @@ void mips_malta_init(MachineState *machine)
/* FPGA */
/* The CBUS UART is attached to the MIPS CPU INT2 pin, ie interrupt 4 */
- malta_fpga_init(system_memory, FPGA_ADDRESS, cbus_irq, serial_hd(2));
+ malta_fpga_init(OBJECT(machine), system_memory, FPGA_ADDRESS, cbus_irq,
+ serial_hd(2));
/* Load firmware in flash / BIOS. */
dinfo = drive_get(IF_PFLASH, 0, fl_idx);
diff --git a/hw/or1k/or1k-sim.c b/hw/or1k/or1k-sim.c
index da05d7cbe3..7ea61327c3 100644
--- a/hw/or1k/or1k-sim.c
+++ b/hw/or1k/or1k-sim.c
@@ -266,7 +266,7 @@ static void openrisc_sim_serial_init(Or1ksimState *state, hwaddr base,
} else {
serial_irq = get_cpu_irq(cpus, 0, irq_pin);
}
- serial_mm_init(get_system_memory(), base, 0, serial_irq, 115200,
+ serial_mm_init(OBJECT(state), get_system_memory(), base, 0, serial_irq, 115200,
serial_hd(uart_idx),
DEVICE_BIG_ENDIAN);
diff --git a/hw/or1k/virt.c b/hw/or1k/virt.c
index 276be32648..c0e0e3c48b 100644
--- a/hw/or1k/virt.c
+++ b/hw/or1k/virt.c
@@ -238,7 +238,7 @@ static void openrisc_virt_serial_init(OR1KVirtState *state, hwaddr base,
qemu_irq serial_irq = get_per_cpu_irq(OBJECT(state), cpus, num_cpus,
irq_pin);
- serial_mm_init(get_system_memory(), base, 0, serial_irq, 115200,
+ serial_mm_init(OBJECT(state), get_system_memory(), base, 0, serial_irq, 115200,
serial_hd(0), DEVICE_BIG_ENDIAN);
/* Add device tree node for serial. */
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 85977c8b69..f7a7c136da 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -1006,13 +1006,13 @@ void ppce500_init(MachineState *machine)
/* Serial */
if (serial_hd(0)) {
- serial_mm_init(ccsr_addr_space, MPC8544_SERIAL0_REGS_OFFSET,
+ serial_mm_init(OBJECT(machine), ccsr_addr_space, MPC8544_SERIAL0_REGS_OFFSET,
0, qdev_get_gpio_in(mpicdev, 42), 399193,
serial_hd(0), DEVICE_BIG_ENDIAN);
}
if (serial_hd(1)) {
- serial_mm_init(ccsr_addr_space, MPC8544_SERIAL1_REGS_OFFSET,
+ serial_mm_init(OBJECT(machine), ccsr_addr_space, MPC8544_SERIAL1_REGS_OFFSET,
0, qdev_get_gpio_in(mpicdev, 42), 399193,
serial_hd(1), DEVICE_BIG_ENDIAN);
}
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 1eb3c09672..40a7559528 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1311,7 +1311,7 @@ static void pnv_init(MachineState *machine)
pnv->isa_bus = pnv_isa_create(pnv->chips[0], &error_fatal);
/* Create serial port */
- serial_hds_isa_init(pnv->isa_bus, 0, MAX_ISA_SERIAL_PORTS);
+ serial_hds_isa_init(OBJECT(machine), pnv->isa_bus, 0, MAX_ISA_SERIAL_PORTS);
/* Create an RTC ISA device too */
mc146818_rtc_init(OBJECT(machine), pnv->isa_bus, 2000, NULL);
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 68c7328129..499949bfdf 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -200,13 +200,13 @@ static void bamboo_init(MachineState *machine)
memory_region_add_subregion(get_system_memory(), PPC440EP_PCI_IO, isa);
if (serial_hd(0) != NULL) {
- serial_mm_init(address_space_mem, 0xef600300, 0,
+ serial_mm_init(OBJECT(machine), address_space_mem, 0xef600300, 0,
qdev_get_gpio_in(uicdev, 0),
PPC_SERIAL_MM_BAUDBASE, serial_hd(0),
DEVICE_BIG_ENDIAN);
}
if (serial_hd(1) != NULL) {
- serial_mm_init(address_space_mem, 0xef600400, 0,
+ serial_mm_init(OBJECT(machine), address_space_mem, 0xef600400, 0,
qdev_get_gpio_in(uicdev, 1),
PPC_SERIAL_MM_BAUDBASE, serial_hd(1),
DEVICE_BIG_ENDIAN);
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 41d4670fa8..be506b02f2 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -446,13 +446,13 @@ static void sam460ex_init(MachineState *machine)
/* SoC has 4 UARTs but board has only one wired and two described in fdt */
if (serial_hd(0) != NULL) {
- serial_mm_init(get_system_memory(), 0x4ef600300, 0,
+ serial_mm_init(OBJECT(machine), get_system_memory(), 0x4ef600300, 0,
qdev_get_gpio_in(uic[1], 1),
PPC_SERIAL_MM_BAUDBASE, serial_hd(0),
DEVICE_BIG_ENDIAN);
}
if (serial_hd(1) != NULL) {
- serial_mm_init(get_system_memory(), 0x4ef600400, 0,
+ serial_mm_init(OBJECT(machine), get_system_memory(), 0x4ef600400, 0,
qdev_get_gpio_in(uic[0], 1),
PPC_SERIAL_MM_BAUDBASE, serial_hd(1),
DEVICE_BIG_ENDIAN);
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index b81db9e8f3..969f821aca 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -3033,7 +3033,7 @@ static void spapr_machine_init(MachineState *machine)
spapr->vio_bus = spapr_vio_bus_init();
for (i = 0; serial_hd(i); i++) {
- spapr_vty_create(spapr->vio_bus, serial_hd(i));
+ spapr_vty_create(OBJECT(machine), spapr->vio_bus, serial_hd(i));
}
/* We always have at least the nvram device on VIO */
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index 1379c168d3..8f4b8965a9 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -228,7 +228,8 @@ static void virtex_init(MachineState *machine)
irq[i] = qdev_get_gpio_in(dev, i);
}
- serial_mm_init(address_space_mem, UART16550_BASEADDR, 2, irq[UART16550_IRQ],
+ serial_mm_init(OBJECT(machine), address_space_mem, UART16550_BASEADDR, 2,
+ irq[UART16550_IRQ],
115200, serial_hd(0), DEVICE_LITTLE_ENDIAN);
/* 2 timers at irq 2 @ 62 Mhz. */
diff --git a/hw/riscv/boston-aia.c b/hw/riscv/boston-aia.c
index 029cf23696..26bacf0e59 100644
--- a/hw/riscv/boston-aia.c
+++ b/hw/riscv/boston-aia.c
@@ -404,7 +404,8 @@ static void boston_mach_init(MachineState *machine)
memory_region_add_subregion_overlap(sys_mem,
boston_memmap[BOSTON_PLATREG].base, platreg, 0);
- s->uart = serial_mm_init(sys_mem, boston_memmap[BOSTON_UART].base, 2,
+ s->uart = serial_mm_init(OBJECT(machine), sys_mem,
+ boston_memmap[BOSTON_UART].base, 2,
qdev_get_gpio_in(s->cps.aplic, UART_INT), 10000000,
serial_hd(0), DEVICE_LITTLE_ENDIAN);
diff --git a/hw/riscv/k230.c b/hw/riscv/k230.c
index 9c67dfb895..d51ad08d87 100644
--- a/hw/riscv/k230.c
+++ b/hw/riscv/k230.c
@@ -137,8 +137,8 @@ static DeviceState *k230_create_plic(Object *parent, int base_hartid,
memmap[K230_DEV_PLIC].size);
}
-static void k230_create_uart(MemoryRegion *sys_mem, DeviceState *plic,
- int index)
+static void k230_create_uart(Object *parent, MemoryRegion *sys_mem,
+ DeviceState *plic, int index)
{
int uart_dev = K230_DEV_UART0 + index;
g_autofree char *name = g_strdup_printf("uart%d", index);
@@ -147,7 +147,7 @@ static void k230_create_uart(MemoryRegion *sys_mem, DeviceState *plic,
create_unimplemented_device(name, memmap[uart_dev].base,
memmap[uart_dev].size);
- serial_mm_init(sys_mem, memmap[uart_dev].base, 2,
+ serial_mm_init(parent, sys_mem, memmap[uart_dev].base, 2,
qdev_get_gpio_in(plic, K230_UART0_IRQ + index),
399193, serial_hd(index), DEVICE_LITTLE_ENDIAN);
}
@@ -190,7 +190,7 @@ static void k230_soc_realize(DeviceState *dev, Error **errp)
/* UART */
for (int i = 0; i < K230_UART_COUNT; i++) {
- k230_create_uart(sys_mem, DEVICE(s->c908_plic), i);
+ k230_create_uart(OBJECT(s), sys_mem, DEVICE(s->c908_plic), i);
}
/* Watchdog */
diff --git a/hw/riscv/microblaze-v-generic.c b/hw/riscv/microblaze-v-generic.c
index 5864007f01..063be14b19 100644
--- a/hw/riscv/microblaze-v-generic.c
+++ b/hw/riscv/microblaze-v-generic.c
@@ -100,7 +100,7 @@ static void mb_v_generic_init(MachineState *machine)
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[UARTLITE_IRQ]);
/* Full uart */
- serial_mm_init(sysmem, UART16550_BASEADDR + 0x1000, 2,
+ serial_mm_init(OBJECT(machine), sysmem, UART16550_BASEADDR + 0x1000, 2,
irq[UART16550_IRQ], 115200, serial_hd(1),
DEVICE_LITTLE_ENDIAN);
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index 18ce57fba4..52fb5d5970 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -346,23 +346,23 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_EMMC_SD_IRQ));
/* MMUARTs */
- s->serial0 = mchp_pfsoc_mmuart_create(system_memory,
+ s->serial0 = mchp_pfsoc_mmuart_create(OBJECT(s), system_memory,
memmap[MICROCHIP_PFSOC_MMUART0].base,
qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_MMUART0_IRQ),
serial_hd(0));
- s->serial1 = mchp_pfsoc_mmuart_create(system_memory,
+ s->serial1 = mchp_pfsoc_mmuart_create(OBJECT(s), system_memory,
memmap[MICROCHIP_PFSOC_MMUART1].base,
qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_MMUART1_IRQ),
serial_hd(1));
- s->serial2 = mchp_pfsoc_mmuart_create(system_memory,
+ s->serial2 = mchp_pfsoc_mmuart_create(OBJECT(s), system_memory,
memmap[MICROCHIP_PFSOC_MMUART2].base,
qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_MMUART2_IRQ),
serial_hd(2));
- s->serial3 = mchp_pfsoc_mmuart_create(system_memory,
+ s->serial3 = mchp_pfsoc_mmuart_create(OBJECT(s), system_memory,
memmap[MICROCHIP_PFSOC_MMUART3].base,
qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_MMUART3_IRQ),
serial_hd(3));
- s->serial4 = mchp_pfsoc_mmuart_create(system_memory,
+ s->serial4 = mchp_pfsoc_mmuart_create(OBJECT(s), system_memory,
memmap[MICROCHIP_PFSOC_MMUART4].base,
qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_MMUART4_IRQ),
serial_hd(4));
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
index d07edde237..fb62bc9aca 100644
--- a/hw/riscv/sifive_e.c
+++ b/hw/riscv/sifive_e.c
@@ -266,13 +266,13 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
qdev_get_gpio_in(DEVICE(s->plic),
SIFIVE_E_AON_WDT_IRQ));
- sifive_uart_create(sys_mem, memmap[SIFIVE_E_DEV_UART0].base,
+ sifive_uart_create(OBJECT(s), sys_mem, memmap[SIFIVE_E_DEV_UART0].base,
serial_hd(0), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_E_UART0_IRQ));
create_unimplemented_device("riscv.sifive.e.qspi0",
memmap[SIFIVE_E_DEV_QSPI0].base, memmap[SIFIVE_E_DEV_QSPI0].size);
create_unimplemented_device("riscv.sifive.e.pwm0",
memmap[SIFIVE_E_DEV_PWM0].base, memmap[SIFIVE_E_DEV_PWM0].size);
- sifive_uart_create(sys_mem, memmap[SIFIVE_E_DEV_UART1].base,
+ sifive_uart_create(OBJECT(s), sys_mem, memmap[SIFIVE_E_DEV_UART1].base,
serial_hd(1), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_E_UART1_IRQ));
create_unimplemented_device("riscv.sifive.e.qspi1",
memmap[SIFIVE_E_DEV_QSPI1].base, memmap[SIFIVE_E_DEV_QSPI1].size);
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index 41eb22dc02..0ef0124140 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -783,9 +783,9 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
SIFIVE_U_PLIC_CONTEXT_STRIDE,
memmap[SIFIVE_U_DEV_PLIC].size);
g_free(plic_hart_config);
- sifive_uart_create(system_memory, memmap[SIFIVE_U_DEV_UART0].base,
+ sifive_uart_create(OBJECT(s), system_memory, memmap[SIFIVE_U_DEV_UART0].base,
serial_hd(0), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_U_UART0_IRQ));
- sifive_uart_create(system_memory, memmap[SIFIVE_U_DEV_UART1].base,
+ sifive_uart_create(OBJECT(s), system_memory, memmap[SIFIVE_U_DEV_UART1].base,
serial_hd(1), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_U_UART1_IRQ));
riscv_aclint_swi_create(OBJECT(dev), memmap[SIFIVE_U_DEV_CLINT].base, 0,
ms->smp.cpus, false);
diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c
index 6c12d85460..ec6988fe62 100644
--- a/hw/riscv/tt_atlantis.c
+++ b/hw/riscv/tt_atlantis.c
@@ -545,7 +545,7 @@ static void tt_atlantis_machine_init(MachineState *machine)
bootrom);
/* UART1, the soc console (UART0 is for the boot microcontroller) */
- serial_mm_init(system_memory, s->memmap[TT_ATL_UART1].base, 2,
+ serial_mm_init(OBJECT(machine), system_memory, s->memmap[TT_ATL_UART1].base, 2,
qdev_get_gpio_in(s->irqchip, TT_ATL_UART1_IRQ),
115200, serial_hd(0), DEVICE_LITTLE_ENDIAN);
/*
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index d7ce57069a..e1f5f1c889 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -1490,7 +1490,7 @@ static void virt_machine_init(MachineState *machine)
create_platform_bus(s, mmio_irqchip);
- serial_mm_init(system_memory, s->memmap[VIRT_UART0].base,
+ serial_mm_init(OBJECT(machine), system_memory, s->memmap[VIRT_UART0].base,
0, qdev_get_gpio_in(mmio_irqchip, UART0_IRQ), 399193,
serial_hd(0), DEVICE_LITTLE_ENDIAN);
diff --git a/hw/riscv/xiangshan_kmh.c b/hw/riscv/xiangshan_kmh.c
index c1c10e9456..5f44e36400 100644
--- a/hw/riscv/xiangshan_kmh.c
+++ b/hw/riscv/xiangshan_kmh.c
@@ -112,7 +112,7 @@ static void xiangshan_kmh_soc_realize(DeviceState *dev, Error **errp)
s->irqchip = xiangshan_kmh_create_aia(OBJECT(dev), num_harts);
/* UART */
- serial_mm_init(system_memory, memmap[XIANGSHAN_KMH_UART0].base, 2,
+ serial_mm_init(OBJECT(s), system_memory, memmap[XIANGSHAN_KMH_UART0].base, 2,
qdev_get_gpio_in(s->irqchip, XIANGSHAN_KMH_UART0_IRQ),
115200, serial_hd(0), DEVICE_LITTLE_ENDIAN);
diff --git a/hw/sparc64/niagara.c b/hw/sparc64/niagara.c
index d47d62dac7..bceda70f2e 100644
--- a/hw/sparc64/niagara.c
+++ b/hw/sparc64/niagara.c
@@ -151,7 +151,7 @@ static void niagara_init(MachineState *machine)
exit(1);
}
}
- serial_mm_init(sysmem, NIAGARA_UART_BASE, 0, NULL,
+ serial_mm_init(OBJECT(machine), sysmem, NIAGARA_UART_BASE, 0, NULL,
115200, serial_hd(0), DEVICE_BIG_ENDIAN);
create_unimplemented_device("sun4v-iob", NIAGARA_IOBBASE, NIAGARA_IOBSIZE);
sun4v_rtc_init(OBJECT(machine), NIAGARA_RTC_BASE);
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 19a54b1f8a..dbf49ef43d 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -319,14 +319,14 @@ static void ebus_realize(PCIDevice *pci_dev, Error **errp)
/* Serial ports */
i = 0;
if (s->console_serial_base) {
- serial_mm_init(pci_address_space(pci_dev), s->console_serial_base,
+ serial_mm_init(OBJECT(s), pci_address_space(pci_dev), s->console_serial_base,
0, NULL, 115200, serial_hd(i), DEVICE_BIG_ENDIAN);
i++;
}
- serial_hds_isa_init(s->isa_bus, i, MAX_ISA_SERIAL_PORTS);
+ serial_hds_isa_init(OBJECT(s), s->isa_bus, i, MAX_ISA_SERIAL_PORTS);
/* Parallel ports */
- parallel_hds_isa_init(s->isa_bus, MAX_PARALLEL_PORTS);
+ parallel_hds_isa_init(OBJECT(s), s->isa_bus, MAX_PARALLEL_PORTS);
/* Keyboard */
isa_create_simple(OBJECT(s), "i8042", s->isa_bus, TYPE_I8042);
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 07b791b9bf..10bbc34399 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -312,7 +312,7 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
xtfpga_fpga_init(system_io, 0x0d020000, freq);
xtfpga_net_init(system_io, 0x0d030000, 0x0d030400, 0x0d800000, extints[1]);
- serial_mm_init(system_io, 0x0d050020, 2, extints[0],
+ serial_mm_init(OBJECT(machine), system_io, 0x0d050020, 2, extints[0],
115200, serial_hd(0), DEVICE_NATIVE_ENDIAN);
dinfo = drive_get(IF_PFLASH, 0, 0);
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
index b29e7243c7..2770267b4a 100644
--- a/include/hw/arm/exynos4210.h
+++ b/include/hw/arm/exynos4210.h
@@ -120,7 +120,7 @@ uint32_t exynos4210_get_irq(uint32_t grp, uint32_t bit);
/*
* exynos4210 UART
*/
-DeviceState *exynos4210_uart_create(hwaddr addr,
+DeviceState *exynos4210_uart_create(Object *parent, hwaddr addr,
int fifo_size,
int channel,
Chardev *chr,
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
index 2675d064f2..e000dffe13 100644
--- a/include/hw/arm/omap.h
+++ b/include/hw/arm/omap.h
@@ -256,7 +256,7 @@ struct omap_dma_lcd_channel_s {
#define OMAP_DMA_USB_W2FC_TX2 31
struct omap_uart_s;
-struct omap_uart_s *omap_uart_init(hwaddr base,
+struct omap_uart_s *omap_uart_init(Object *parent, hwaddr base,
qemu_irq irq, omap_clk fclk, omap_clk iclk,
qemu_irq txdma, qemu_irq rxdma,
const char *label, Chardev *chr);
@@ -426,7 +426,7 @@ struct omap_mpu_state_s {
};
/* omap1.c */
-struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *sdram,
+struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *sdram,
const char *core);
#define OMAP_BAD_REG(paddr) \
diff --git a/include/hw/char/mchp_pfsoc_mmuart.h b/include/hw/char/mchp_pfsoc_mmuart.h
index 1e27732df1..af6ab2f2a9 100644
--- a/include/hw/char/mchp_pfsoc_mmuart.h
+++ b/include/hw/char/mchp_pfsoc_mmuart.h
@@ -62,7 +62,7 @@ typedef struct MchpPfSoCMMUartState {
*
* @return: a pointer to the device specific control structure
*/
-MchpPfSoCMMUartState *mchp_pfsoc_mmuart_create(MemoryRegion *sysmem,
+MchpPfSoCMMUartState *mchp_pfsoc_mmuart_create(Object *parent, MemoryRegion *sysmem,
hwaddr base, qemu_irq irq, Chardev *chr);
#endif /* HW_MCHP_PFSOC_MMUART_H */
diff --git a/include/hw/char/parallel.h b/include/hw/char/parallel.h
index f2c92eb5bc..782cc12602 100644
--- a/include/hw/char/parallel.h
+++ b/include/hw/char/parallel.h
@@ -23,7 +23,7 @@ typedef struct ParallelState {
int it_shift;
} ParallelState;
-void parallel_hds_isa_init(ISABus *bus, int n);
+void parallel_hds_isa_init(Object *parent, ISABus *bus, int n);
bool parallel_mm_init(MemoryRegion *address_space,
hwaddr base, int it_shift, qemu_irq irq,
diff --git a/include/hw/char/pl011.h b/include/hw/char/pl011.h
index 5695787650..474cbaa5df 100644
--- a/include/hw/char/pl011.h
+++ b/include/hw/char/pl011.h
@@ -60,6 +60,6 @@ struct PL011State {
uint8_t padding_for_rust[16];
};
-DeviceState *pl011_create(hwaddr addr, qemu_irq irq, Chardev *chr);
+DeviceState *pl011_create(Object *parent, hwaddr addr, qemu_irq irq, Chardev *chr);
#endif
diff --git a/include/hw/char/serial-isa.h b/include/hw/char/serial-isa.h
index 8517afa128..2653f9c12d 100644
--- a/include/hw/char/serial-isa.h
+++ b/include/hw/char/serial-isa.h
@@ -31,7 +31,7 @@
#define MAX_ISA_SERIAL_PORTS 4
#define TYPE_ISA_SERIAL "isa-serial"
-void serial_hds_isa_init(ISABus *bus, int from, int to);
+void serial_hds_isa_init(Object *parent, ISABus *bus, int from, int to);
void isa_serial_set_iobase(ISADevice *serial, hwaddr iobase);
void isa_serial_set_enabled(ISADevice *serial, bool enabled);
diff --git a/include/hw/char/serial-mm.h b/include/hw/char/serial-mm.h
index 0076bdc061..7b99a1db71 100644
--- a/include/hw/char/serial-mm.h
+++ b/include/hw/char/serial-mm.h
@@ -44,7 +44,7 @@ struct SerialMM {
uint8_t endianness;
};
-SerialMM *serial_mm_init(MemoryRegion *address_space,
+SerialMM *serial_mm_init(Object *parent, MemoryRegion *address_space,
hwaddr base, int regshift,
qemu_irq irq, int baudbase,
Chardev *chr, enum device_endian end);
diff --git a/include/hw/char/sifive_uart.h b/include/hw/char/sifive_uart.h
index 5f3b1327de..fca1c6fdb9 100644
--- a/include/hw/char/sifive_uart.h
+++ b/include/hw/char/sifive_uart.h
@@ -85,7 +85,7 @@ struct SiFiveUARTState {
QEMUTimer *fifo_trigger_handle;
};
-SiFiveUARTState *sifive_uart_create(MemoryRegion *address_space, hwaddr base,
- Chardev *chr, qemu_irq irq);
+SiFiveUARTState *sifive_uart_create(Object *parent, MemoryRegion *address_space,
+ hwaddr base, Chardev *chr, qemu_irq irq);
#endif
diff --git a/include/hw/m68k/mcf.h b/include/hw/m68k/mcf.h
index ff818c55d0..af501ee459 100644
--- a/include/hw/m68k/mcf.h
+++ b/include/hw/m68k/mcf.h
@@ -10,8 +10,9 @@ uint64_t mcf_uart_read(void *opaque, hwaddr addr,
unsigned size);
void mcf_uart_write(void *opaque, hwaddr addr,
uint64_t val, unsigned size);
-DeviceState *mcf_uart_create(qemu_irq irq, Chardev *chr);
-DeviceState *mcf_uart_create_mmap(hwaddr base, qemu_irq irq, Chardev *chr);
+DeviceState *mcf_uart_create(Object *parent, qemu_irq irq, Chardev *chr);
+DeviceState *mcf_uart_create_mmap(Object *parent, hwaddr base, qemu_irq irq,
+ Chardev *chr);
/* mcf_intc.c */
DeviceState *mcf_intc_init(Object *parent, struct MemoryRegion *sysmem,
diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h
index fcb29aebff..3ca0c9d261 100644
--- a/include/hw/ppc/spapr_vio.h
+++ b/include/hw/ppc/spapr_vio.h
@@ -137,7 +137,7 @@ int spapr_vio_send_crq(SpaprVioDevice *dev, uint8_t *crq);
SpaprVioDevice *vty_lookup(SpaprMachineState *spapr, target_ulong reg);
void vty_putchars(SpaprVioDevice *sdev, uint8_t *buf, int len);
-void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev);
+void spapr_vty_create(Object *parent, SpaprVioBus *bus, Chardev *chardev);
void spapr_vlan_create(Object *parent, SpaprVioBus *bus, NICInfo *nd);
void spapr_vscsi_create(Object *parent, SpaprVioBus *bus);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 049/134] hw/isa: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (47 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 048/134] hw/char: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 050/134] hw/pci: " Alexander Graf
` (85 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/isa to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/isa/i82378.c:106 | isa_new | OBJECT(s) | "pcspk" | i82378_realize() creates ISA children of the i82378 PCI-ISA bridge
hw/isa/i82378.c:113 | isa_create_simple | OBJECT(s) | "dma" | i82378_realize() creates ISA children of the i82378 PCI-ISA bridge
hw/isa/isa-bus.c:62 | qdev_new_orphan | ORPHAN-JUSTIFIED | - | fallback isabus-bridge when caller passes dev==NULL; parenting requires isa_bus_new() signature change across many callers, deferred
hw/isa/isa-bus.c:174 | isa_new_orphan | ORPHAN-JUSTIFIED | - | API definition (transitional _orphan wrapper)
hw/isa/isa-bus.c:176 | qdev_new_orphan | ORPHAN-JUSTIFIED | - | API definition body of isa_new_orphan()
hw/isa/isa-bus.c:179 | isa_try_new_orphan | ORPHAN-JUSTIFIED | - | API definition (transitional _orphan wrapper)
hw/isa/isa-bus.c:181 | qdev_try_new_orphan | ORPHAN-JUSTIFIED | - | API definition body of isa_try_new_orphan()
hw/isa/isa-bus.c:184 | isa_create_simple_orphan | ORPHAN-JUSTIFIED | - | API definition (transitional _orphan wrapper)
hw/isa/isa-bus.c:188 | isa_new_orphan | ORPHAN-JUSTIFIED | - | API definition body of isa_create_simple_orphan()
hw/isa/isa-bus.c:208 | isa_create_simple_orphan | ORPHAN-JUSTIFIED | - | isa_vga_init() is a public helper called from board code (hw/i386/pc.c); needs Object *parent threaded through include/hw/isa/isa.h; deferred to caller-side patch
hw/isa/isa-bus.c:213 | isa_create_simple_orphan | ORPHAN-JUSTIFIED | - | isa_vga_init() is a public helper called from board code; deferred to caller-side patch
hw/isa/isa-superio.c:57 | isa_new | OBJECT(dev) | name | isa_superio_realize(); collapse existing object_property_add_child(OBJECT(dev), name, ...) keeping dynamic per-index name
hw/isa/isa-superio.c:96 | isa_new | OBJECT(dev) | name | isa_superio_realize(); collapse existing object_property_add_child(OBJECT(dev), name, ...) keeping dynamic per-index name
hw/isa/isa-superio.c:123 | isa_new | OBJECT(sio) | "isa-fdc" | isa_superio_realize(); collapse existing object_property_add_child(OBJECT(sio), "isa-fdc", ...)
hw/isa/isa-superio.c:147 | isa_new | OBJECT(sio) | TYPE_I8042 | isa_superio_realize(); collapse existing object_property_add_child(OBJECT(sio), TYPE_I8042, ...)
hw/isa/isa-superio.c:154 | isa_new | OBJECT(sio) | "isa-ide" | isa_superio_realize(); collapse existing object_property_add_child(OBJECT(sio), "isa-ide", ...)
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/isa/i82378.c | 6 +++---
hw/isa/isa-superio.c | 25 ++++++++++---------------
2 files changed, 13 insertions(+), 18 deletions(-)
diff --git a/hw/isa/i82378.c b/hw/isa/i82378.c
index da09d869f5..1c0a6ad779 100644
--- a/hw/isa/i82378.c
+++ b/hw/isa/i82378.c
@@ -103,14 +103,14 @@ static void i82378_realize(PCIDevice *pci, Error **errp)
pit = i8254_pit_init(isabus, 0x40, 0, NULL);
/* speaker */
- pcspk = isa_new_orphan(TYPE_PC_SPEAKER);
+ pcspk = isa_new(OBJECT(s), "pcspk", TYPE_PC_SPEAKER);
object_property_set_link(OBJECT(pcspk), "pit", OBJECT(pit), &error_fatal);
- if (!isa_realize_and_unref(pcspk, isabus, errp)) {
+ if (!qdev_realize(DEVICE(pcspk), BUS(isabus), errp)) {
return;
}
/* 2 82C37 (dma) */
- isa_create_simple_orphan(isabus, "i82374");
+ isa_create_simple(OBJECT(s), "dma", isabus, "i82374");
}
static void i82378_init(Object *obj)
diff --git a/hw/isa/isa-superio.c b/hw/isa/isa-superio.c
index 2d65255f34..d0c3c1dbd3 100644
--- a/hw/isa/isa-superio.c
+++ b/hw/isa/isa-superio.c
@@ -54,7 +54,7 @@ static void isa_superio_realize(DeviceState *dev, Error **errp)
} else {
name = g_strdup_printf("parallel%d", i);
}
- isa = isa_new_orphan(TYPE_ISA_PARALLEL);
+ isa = isa_new(OBJECT(dev), name, TYPE_ISA_PARALLEL);
d = DEVICE(isa);
qdev_prop_set_uint32(d, "index", i);
if (k->parallel.get_iobase) {
@@ -65,8 +65,7 @@ static void isa_superio_realize(DeviceState *dev, Error **errp)
qdev_prop_set_uint32(d, "irq", k->parallel.get_irq(sio, i));
}
qdev_prop_set_chr(d, "chardev", chr);
- object_property_add_child(OBJECT(dev), name, OBJECT(isa));
- isa_realize_and_unref(isa, bus, &error_fatal);
+ qdev_realize(DEVICE(isa), BUS(bus), &error_fatal);
sio->parallel[i] = isa;
trace_superio_create_parallel(i,
k->parallel.get_iobase ?
@@ -93,7 +92,7 @@ static void isa_superio_realize(DeviceState *dev, Error **errp)
} else {
name = g_strdup_printf("serial%d", i);
}
- isa = isa_new_orphan(TYPE_ISA_SERIAL);
+ isa = isa_new(OBJECT(dev), name, TYPE_ISA_SERIAL);
d = DEVICE(isa);
qdev_prop_set_uint32(d, "index", i);
if (k->serial.get_iobase) {
@@ -104,8 +103,7 @@ static void isa_superio_realize(DeviceState *dev, Error **errp)
qdev_prop_set_uint32(d, "irq", k->serial.get_irq(sio, i));
}
qdev_prop_set_chr(d, "chardev", chr);
- object_property_add_child(OBJECT(dev), name, OBJECT(isa));
- isa_realize_and_unref(isa, bus, &error_fatal);
+ qdev_realize(DEVICE(isa), BUS(bus), &error_fatal);
sio->serial[i] = isa;
trace_superio_create_serial(i,
k->serial.get_iobase ?
@@ -120,7 +118,7 @@ static void isa_superio_realize(DeviceState *dev, Error **errp)
assert(k->floppy.count <= 1);
if (k->floppy.count &&
(!k->floppy.is_enabled || k->floppy.is_enabled(sio, 0))) {
- isa = isa_new_orphan(TYPE_ISA_FDC);
+ isa = isa_new(OBJECT(sio), "isa-fdc", TYPE_ISA_FDC);
d = DEVICE(isa);
if (k->floppy.get_iobase) {
qdev_prop_set_uint32(d, "iobase", k->floppy.get_iobase(sio, 0));
@@ -132,8 +130,7 @@ static void isa_superio_realize(DeviceState *dev, Error **errp)
for (i = 0; i < MAX_FD; i++) {
fd[i] = drive_get(IF_FLOPPY, 0, i);
}
- object_property_add_child(OBJECT(sio), "isa-fdc", OBJECT(isa));
- isa_realize_and_unref(isa, bus, &error_fatal);
+ qdev_realize(DEVICE(isa), BUS(bus), &error_fatal);
isa_fdc_init_drives(isa, fd);
sio->floppy = isa;
trace_superio_create_floppy(0,
@@ -144,14 +141,13 @@ static void isa_superio_realize(DeviceState *dev, Error **errp)
}
/* Keyboard, mouse */
- isa = isa_new_orphan(TYPE_I8042);
- object_property_add_child(OBJECT(sio), TYPE_I8042, OBJECT(isa));
- isa_realize_and_unref(isa, bus, &error_fatal);
+ isa = isa_new(OBJECT(sio), TYPE_I8042, TYPE_I8042);
+ qdev_realize(DEVICE(isa), BUS(bus), &error_fatal);
sio->kbc = isa;
/* IDE */
if (k->ide.count && (!k->ide.is_enabled || k->ide.is_enabled(sio, 0))) {
- isa = isa_new_orphan("isa-ide");
+ isa = isa_new(OBJECT(sio), "isa-ide", "isa-ide");
d = DEVICE(isa);
if (k->ide.get_iobase) {
qdev_prop_set_uint32(d, "iobase", k->ide.get_iobase(sio, 0));
@@ -162,8 +158,7 @@ static void isa_superio_realize(DeviceState *dev, Error **errp)
if (k->ide.get_irq) {
qdev_prop_set_uint32(d, "irq", k->ide.get_irq(sio, 0));
}
- object_property_add_child(OBJECT(sio), "isa-ide", OBJECT(isa));
- isa_realize_and_unref(isa, bus, &error_fatal);
+ qdev_realize(DEVICE(isa), BUS(bus), &error_fatal);
sio->ide = isa;
trace_superio_create_ide(0,
k->ide.get_iobase ?
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 050/134] hw/pci: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (48 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 049/134] hw/isa: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 051/134] hw/riscv: " Alexander Graf
` (84 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/pci to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/pci/pci.c:2121 | pci_new_orphan | ORPHAN-JUSTIFIED | - | pci_init_nic_in_slot() is a public helper called from board init in hw/{riscv,sh4,ppc,mips}; parenting requires threading Object* through include/hw/pci/pci.h and 5 callers; deferred to caller-side patches
hw/pci/pci.c:2132 | pci_create_simple_orphan | ORPHAN-JUSTIFIED | - | pci_vga_init() is a public helper called from board init in hw/{i386,ppc,mips,alpha}; parenting requires threading Object* through include/hw/pci/pci.h and 11 callers; deferred to caller-side patches
hw/pci/pci.c:2134 | pci_create_simple_orphan | ORPHAN-JUSTIFIED | - | pci_vga_init() public helper; deferred (see :2132)
hw/pci/pci.c:2136 | pci_create_simple_orphan | ORPHAN-JUSTIFIED | - | pci_vga_init() public helper; deferred (see :2132)
hw/pci/pci.c:2138 | pci_create_simple_orphan | ORPHAN-JUSTIFIED | - | pci_vga_init() public helper; deferred (see :2132)
hw/pci/pci.c:2140 | pci_create_simple_orphan | ORPHAN-JUSTIFIED | - | pci_vga_init() public helper; deferred (see :2132)
hw/pci/pci.c:2396 | qdev_new_orphan | ORPHAN-JUSTIFIED | - | pci_new_internal() is the implementation body of pci_new*_orphan() transitional API
hw/pci/pci.c:2443 | pci_new_multifunction_orphan | ORPHAN-JUSTIFIED | - | API definition (transitional _orphan wrapper)
hw/pci/pci.c:2448 | pci_new_orphan | ORPHAN-JUSTIFIED | - | API definition (transitional _orphan wrapper)
hw/pci/pci.c:2458 | pci_create_simple_multifunction_orphan | ORPHAN-JUSTIFIED | - | API definition (transitional _orphan wrapper)
hw/pci/pci.c:2461 | pci_new_multifunction_orphan | ORPHAN-JUSTIFIED | - | API definition body of pci_create_simple_multifunction_orphan()
hw/pci/pci.c:2466 | pci_create_simple_orphan | ORPHAN-JUSTIFIED | - | API definition (transitional _orphan wrapper)
hw/pci/pci.c:2468 | pci_new_orphan | ORPHAN-JUSTIFIED | - | API definition body of pci_create_simple_orphan()
hw/pci/pcie_sriov.c:174 | pci_new | OBJECT(dev) | "vf[*]" | pcie_sriov_pf_init(): VFs are children of the PF PCIDevice; already uses qdev_realize(); drop extra object_unref() on error path since parent child<> holds the only ref
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/pci/pcie_sriov.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/hw/pci/pcie_sriov.c b/hw/pci/pcie_sriov.c
index a69a41cdde..eb1707bb41 100644
--- a/hw/pci/pcie_sriov.c
+++ b/hw/pci/pcie_sriov.c
@@ -171,13 +171,12 @@ bool pcie_sriov_pf_init(PCIDevice *dev, uint16_t offset,
dev->exp.sriov_pf.vf = g_new(PCIDevice *, total_vfs);
for (uint16_t i = 0; i < total_vfs; i++) {
- PCIDevice *vf = pci_new_orphan(devfn, vfname);
+ PCIDevice *vf = pci_new(OBJECT(dev), "vf[*]", devfn, vfname);
vf->exp.sriov_vf.pf = dev;
vf->exp.sriov_vf.vf_number = i;
if (!qdev_realize(&vf->qdev, bus, errp)) {
object_unparent(OBJECT(vf));
- object_unref(vf);
unparent_vfs(dev, i);
return false;
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 051/134] hw/riscv: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (49 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 050/134] hw/pci: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 052/134] hw/mips: " Alexander Graf
` (83 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/riscv to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/riscv/boston-aia.c:308 | qdev_new | OBJECT(machine) | "pcie" | static helper called from board init; thread Object *parent through
hw/riscv/boston-aia.c:355 | qdev_new | OBJECT(machine) | "boston" | board MachineClass.init()
hw/riscv/boston-aia.c:422 | pci_create_simple_multifunction | OBJECT(machine) | "ahci" | board MachineClass.init()
hw/riscv/microblaze-v-generic.c:82 | qdev_new | OBJECT(machine) | "intc" | board MachineClass.init()
hw/riscv/microblaze-v-generic.c:95 | qdev_new | OBJECT(machine) | "uartlite" | board MachineClass.init()
hw/riscv/microblaze-v-generic.c:108 | qdev_new | OBJECT(machine) | "timer[*]" | board MachineClass.init(); two timers
hw/riscv/microblaze-v-generic.c:117 | qdev_new | OBJECT(machine) | "timer[*]" | board MachineClass.init(); two timers
hw/riscv/microblaze-v-generic.c:126 | qdev_new | OBJECT(machine) | "ethlite" | board MachineClass.init()
hw/riscv/microblaze-v-generic.c:136 | qdev_new | OBJECT(machine) | "xilinx-eth" | board init; collapse existing object_property_add_child, keep name
hw/riscv/microblaze-v-generic.c:137 | qdev_new | OBJECT(machine) | "xilinx-dma" | board init; collapse existing object_property_add_child, keep name
hw/riscv/microchip_pfsoc.c:584 | qdev_new | OBJECT(machine) | "sd-card" | board MachineClass.init()
hw/riscv/sifive_u.c:596 | qdev_new | OBJECT(machine) | "flash" | board MachineClass.init()
hw/riscv/sifive_u.c:609 | ssi_create_peripheral | OBJECT(machine) | "ssi-sd" | board MachineClass.init()
hw/riscv/sifive_u.c:616 | qdev_new | OBJECT(machine) | "sd-card" | board MachineClass.init()
hw/riscv/tt_atlantis.c:580 | i2c_slave_create_simple | OBJECT(s) | "rtc" | board init; s is TTAtlantisState (machine)
hw/riscv/tt_atlantis.c:581 | i2c_slave_create_simple | OBJECT(s) | "tmp105" | board init; s is TTAtlantisState (machine)
hw/riscv/virt.c:129 | qdev_new | OBJECT(s) | name | helper receives RISCVVirtState *s; collapse existing object_property_add_child, keep name arg
hw/riscv/virt.c:1054 | qdev_new | OBJECT(s) | "pcie" | helper receives RISCVVirtState *s (machine)
hw/riscv/virt.c:1147 | qdev_new | OBJECT(s) | "platform-bus" | helper receives RISCVVirtState *s (machine)
hw/riscv/virt.c:1484 | sysbus_create_simple | OBJECT(machine) | "virtio-mmio[*]" | board MachineClass.init(); loop
hw/riscv/virt.c:1497 | sysbus_create_simple | OBJECT(machine) | "rtc" | board MachineClass.init()
hw/riscv/virt.c:1519 | qdev_new | OBJECT(machine) | "iommu" | board MachineClass.init()
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/riscv/boston-aia.c | 17 +++++++++--------
hw/riscv/microblaze-v-generic.c | 32 ++++++++++++++------------------
hw/riscv/microchip_pfsoc.c | 5 +++--
hw/riscv/sifive_u.c | 15 ++++++++-------
hw/riscv/tt_atlantis.c | 5 +++--
hw/riscv/virt.c | 24 ++++++++++++------------
6 files changed, 49 insertions(+), 49 deletions(-)
diff --git a/hw/riscv/boston-aia.c b/hw/riscv/boston-aia.c
index 26bacf0e59..3b0eba00a7 100644
--- a/hw/riscv/boston-aia.c
+++ b/hw/riscv/boston-aia.c
@@ -297,7 +297,7 @@ static void gen_firmware(uint32_t *p)
}
static inline XilinxPCIEHost *
-xilinx_pcie_init(MemoryRegion *sys_mem, uint32_t bus_nr,
+xilinx_pcie_init(Object *parent, MemoryRegion *sys_mem, uint32_t bus_nr,
hwaddr cfg_base, uint64_t cfg_size,
hwaddr mmio_base, uint64_t mmio_size,
qemu_irq irq)
@@ -305,7 +305,7 @@ xilinx_pcie_init(MemoryRegion *sys_mem, uint32_t bus_nr,
DeviceState *dev;
MemoryRegion *cfg, *mmio;
- dev = qdev_new_orphan(TYPE_XILINX_PCIE_HOST);
+ dev = qdev_new(parent, "pcie", TYPE_XILINX_PCIE_HOST);
qdev_prop_set_uint32(dev, "bus_nr", bus_nr);
qdev_prop_set_uint64(dev, "cfg_base", cfg_base);
@@ -313,7 +313,7 @@ xilinx_pcie_init(MemoryRegion *sys_mem, uint32_t bus_nr,
qdev_prop_set_uint64(dev, "mmio_base", mmio_base);
qdev_prop_set_uint64(dev, "mmio_size", mmio_size);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
cfg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
memory_region_add_subregion_overlap(sys_mem, cfg_base, cfg, 0);
@@ -352,8 +352,8 @@ static void boston_mach_init(MachineState *machine)
exit(1);
}
- dev = qdev_new_orphan(TYPE_MIPS_BOSTON_AIA);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(machine), "boston", TYPE_MIPS_BOSTON_AIA);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
s = BOSTON(dev);
s->mach = machine;
@@ -390,7 +390,7 @@ static void boston_mach_init(MachineState *machine)
MIN(machine->ram_size, (256 * MiB)));
memory_region_add_subregion_overlap(sys_mem, 0, ddr_low_alias, 0);
- pcie2 = xilinx_pcie_init(sys_mem, 2,
+ pcie2 = xilinx_pcie_init(OBJECT(machine), sys_mem, 2,
boston_memmap[BOSTON_PCIE2].base,
boston_memmap[BOSTON_PCIE2].size,
boston_memmap[BOSTON_PCIE2_MMIO].base,
@@ -419,8 +419,9 @@ static void boston_mach_init(MachineState *machine)
qemu_chr_fe_set_handlers(&s->lcd_display, NULL, NULL,
boston_lcd_event, NULL, s, NULL, true);
- pdev = pci_create_simple_multifunction_orphan(&PCI_BRIDGE(&pcie2->root)->sec_bus,
- PCI_DEVFN(0, 0), TYPE_ICH9_AHCI);
+ pdev = pci_create_simple_multifunction(OBJECT(machine), "ahci",
+ &PCI_BRIDGE(&pcie2->root)->sec_bus,
+ PCI_DEVFN(0, 0), TYPE_ICH9_AHCI);
ich9 = ICH9_AHCI(pdev);
g_assert(ARRAY_SIZE(hd) == ich9->ahci.ports);
ide_drive_get(hd, ich9->ahci.ports);
diff --git a/hw/riscv/microblaze-v-generic.c b/hw/riscv/microblaze-v-generic.c
index 063be14b19..fbfdec7ede 100644
--- a/hw/riscv/microblaze-v-generic.c
+++ b/hw/riscv/microblaze-v-generic.c
@@ -79,11 +79,11 @@ static void mb_v_generic_init(MachineState *machine)
ram_size, &error_fatal);
memory_region_add_subregion(sysmem, ddr_base, phys_ram);
- dev = qdev_new_orphan("xlnx.xps-intc");
+ dev = qdev_new(OBJECT(machine), "intc", "xlnx.xps-intc");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_uint32(dev, "kind-of-intr",
1 << UARTLITE_IRQ);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, INTC_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
qdev_get_gpio_in(DEVICE(cpu), 11));
@@ -92,10 +92,10 @@ static void mb_v_generic_init(MachineState *machine)
}
/* Uartlite */
- dev = qdev_new_orphan(TYPE_XILINX_UARTLITE);
+ dev = qdev_new(OBJECT(machine), "uartlite", TYPE_XILINX_UARTLITE);
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, UARTLITE_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[UARTLITE_IRQ]);
@@ -105,40 +105,36 @@ static void mb_v_generic_init(MachineState *machine)
DEVICE_LITTLE_ENDIAN);
/* 2 timers at irq 0 @ 100 Mhz. */
- dev = qdev_new_orphan("xlnx.xps-timer");
+ dev = qdev_new(OBJECT(machine), "timer[*]", "xlnx.xps-timer");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_uint32(dev, "one-timer-only", 0);
qdev_prop_set_uint32(dev, "clock-frequency", 100000000);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, TIMER_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[TIMER_IRQ]);
/* 2 timers at irq 3 @ 100 Mhz. */
- dev = qdev_new_orphan("xlnx.xps-timer");
+ dev = qdev_new(OBJECT(machine), "timer[*]", "xlnx.xps-timer");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qdev_prop_set_uint32(dev, "one-timer-only", 0);
qdev_prop_set_uint32(dev, "clock-frequency", 100000000);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, TIMER_BASEADDR2);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[TIMER_IRQ2]);
/* Emaclite */
- dev = qdev_new_orphan("xlnx.xps-ethernetlite");
+ dev = qdev_new(OBJECT(machine), "ethlite", "xlnx.xps-ethernetlite");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_LITTLE);
qemu_configure_nic_device(dev, true, NULL);
qdev_prop_set_uint32(dev, "tx-ping-pong", 0);
qdev_prop_set_uint32(dev, "rx-ping-pong", 0);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, ETHLITE_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[ETHLITE_IRQ]);
/* axi ethernet and dma initialization. */
- eth0 = qdev_new_orphan("xlnx.axi-ethernet");
- dma = qdev_new_orphan("xlnx.axi-dma");
-
- /* FIXME: attach to the sysbus instead */
- object_property_add_child(qdev_get_machine(), "xilinx-eth", OBJECT(eth0));
- object_property_add_child(qdev_get_machine(), "xilinx-dma", OBJECT(dma));
+ eth0 = qdev_new(OBJECT(machine), "xilinx-eth", "xlnx.axi-ethernet");
+ dma = qdev_new(OBJECT(machine), "xilinx-dma", "xlnx.axi-dma");
ds = object_property_get_link(OBJECT(dma),
"axistream-connected-target", NULL);
@@ -151,7 +147,7 @@ static void mb_v_generic_init(MachineState *machine)
&error_abort);
object_property_set_link(OBJECT(eth0), "axistream-control-connected", cs,
&error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(eth0), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(eth0), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(eth0), 0, AXIENET_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(eth0), 0, irq[AXIENET_IRQ]);
@@ -164,7 +160,7 @@ static void mb_v_generic_init(MachineState *machine)
&error_abort);
object_property_set_link(OBJECT(dma), "axistream-control-connected", cs,
&error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dma), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dma), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dma), 0, AXIDMA_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dma), 0, irq[AXIDMA_IRQ0]);
sysbus_connect_irq(SYS_BUS_DEVICE(dma), 1, irq[AXIDMA_IRQ1]);
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index 52fb5d5970..0d298aa3fc 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -581,11 +581,12 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
/* Attach an SD card */
if (dinfo) {
CadenceSDHCIState *sdhci = &(s->soc.sdhci);
- DeviceState *card = qdev_new_orphan(TYPE_SD_CARD);
+ DeviceState *card = qdev_new(OBJECT(machine), "sd-card",
+ TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
- qdev_realize_and_unref(card, sdhci->bus, &error_fatal);
+ qdev_realize(card, sdhci->bus, &error_fatal);
}
/*
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index 0ef0124140..3d60a501dd 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -593,31 +593,32 @@ static void sifive_u_machine_init(MachineState *machine)
sizeof(reset_vec), kernel_entry);
/* Connect an SPI flash to SPI0 */
- flash_dev = qdev_new_orphan("is25wp256");
+ flash_dev = qdev_new(OBJECT(machine), "flash", "is25wp256");
dinfo = drive_get(IF_MTD, 0, 0);
if (dinfo) {
qdev_prop_set_drive_err(flash_dev, "drive",
blk_by_legacy_dinfo(dinfo),
&error_fatal);
}
- qdev_realize_and_unref(flash_dev, BUS(s->soc.spi0.spi), &error_fatal);
+ qdev_realize(flash_dev, BUS(s->soc.spi0.spi), &error_fatal);
flash_cs = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
sysbus_connect_irq(SYS_BUS_DEVICE(&s->soc.spi0), 1, flash_cs);
/* Connect an SD card to SPI2 */
- sd_dev = ssi_create_peripheral_orphan(s->soc.spi2.spi, "ssi-sd");
+ sd_dev = ssi_create_peripheral(OBJECT(machine), "ssi-sd",
+ s->soc.spi2.spi, "ssi-sd");
sd_cs = qdev_get_gpio_in_named(sd_dev, SSI_GPIO_CS, 0);
sysbus_connect_irq(SYS_BUS_DEVICE(&s->soc.spi2), 1, sd_cs);
dinfo = drive_get(IF_SD, 0, 0);
blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
- card_dev = qdev_new_orphan(TYPE_SD_CARD_SPI);
+ card_dev = qdev_new(OBJECT(machine), "sd-card", TYPE_SD_CARD_SPI);
qdev_prop_set_drive_err(card_dev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(card_dev,
- qdev_get_child_bus(sd_dev, "sd-bus"),
- &error_fatal);
+ qdev_realize(card_dev,
+ qdev_get_child_bus(sd_dev, "sd-bus"),
+ &error_fatal);
}
static bool sifive_u_machine_get_start_in_flash(Object *obj, Error **errp)
diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c
index ec6988fe62..57ced817e3 100644
--- a/hw/riscv/tt_atlantis.c
+++ b/hw/riscv/tt_atlantis.c
@@ -577,8 +577,9 @@ static void tt_atlantis_machine_init(MachineState *machine)
}
/* I2C peripherals: qemu specific */
- i2c_slave_create_simple_orphan(i2c_get_bus(s, 0), "ds1338", 0x6f);
- i2c_slave_create_simple_orphan(i2c_get_bus(s, 4), "tmp105", 0x48);
+ i2c_slave_create_simple(OBJECT(s), "rtc", i2c_get_bus(s, 0), "ds1338", 0x6f);
+ i2c_slave_create_simple(OBJECT(s), "tmp105", i2c_get_bus(s, 4),
+ "tmp105", 0x48);
/* Load or create device tree */
if (machine->dtb) {
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index e1f5f1c889..7e5bdaf210 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -126,7 +126,7 @@ static PFlashCFI01 *virt_flash_create1(RISCVVirtState *s,
* Create a single flash device. We use the same parameters as
* the flash devices on the ARM virt board.
*/
- DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new(OBJECT(s), name, TYPE_PFLASH_CFI01);
qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE);
qdev_prop_set_uint8(dev, "width", 4);
@@ -138,7 +138,6 @@ static PFlashCFI01 *virt_flash_create1(RISCVVirtState *s,
qdev_prop_set_uint16(dev, "id3", 0x00);
qdev_prop_set_string(dev, "name", name);
- object_property_add_child(OBJECT(s), name, OBJECT(dev));
object_property_add_alias(OBJECT(s), alias_prop_name,
OBJECT(dev), "drive");
@@ -160,7 +159,7 @@ static void virt_flash_map1(PFlashCFI01 *flash,
assert(QEMU_IS_ALIGNED(size, VIRT_FLASH_SECTOR_SIZE));
assert(size / VIRT_FLASH_SECTOR_SIZE <= UINT32_MAX);
qdev_prop_set_uint32(dev, "num-blocks", size / VIRT_FLASH_SECTOR_SIZE);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
memory_region_add_subregion(sysmem, base,
sysbus_mmio_get_region(SYS_BUS_DEVICE(dev),
@@ -1051,7 +1050,7 @@ static inline DeviceState *gpex_pcie_init(MemoryRegion *sys_mem,
qemu_irq irq;
int i;
- dev = qdev_new_orphan(TYPE_GPEX_HOST);
+ dev = qdev_new(OBJECT(s), "pcie", TYPE_GPEX_HOST);
/* Set GPEX object properties for the virt machine */
object_property_set_uint(OBJECT(dev), PCI_HOST_ECAM_BASE,
@@ -1071,7 +1070,7 @@ static inline DeviceState *gpex_pcie_init(MemoryRegion *sys_mem,
object_property_set_int(OBJECT(dev), PCI_HOST_PIO_SIZE,
pio_size, NULL);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
ecam_alias = g_new0(MemoryRegion, 1);
ecam_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
@@ -1144,11 +1143,11 @@ static void create_platform_bus(RISCVVirtState *s, DeviceState *irqchip)
int i;
MemoryRegion *sysmem = get_system_memory();
- dev = qdev_new_orphan(TYPE_PLATFORM_BUS_DEVICE);
+ dev = qdev_new(OBJECT(s), "platform-bus", TYPE_PLATFORM_BUS_DEVICE);
dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE);
qdev_prop_set_uint32(dev, "num_irqs", VIRT_PLATFORM_BUS_NUM_IRQS);
qdev_prop_set_uint32(dev, "mmio_size", s->memmap[VIRT_PLATFORM_BUS].size);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
s->platform_bus_dev = dev;
sysbus = SYS_BUS_DEVICE(dev);
@@ -1481,7 +1480,7 @@ static void virt_machine_init(MachineState *machine)
/* VirtIO MMIO devices */
for (i = 0; i < VIRTIO_COUNT; i++) {
- sysbus_create_simple_orphan("virtio-mmio",
+ sysbus_create_simple(OBJECT(machine), "virtio-mmio[*]", "virtio-mmio",
s->memmap[VIRT_VIRTIO].base + i * s->memmap[VIRT_VIRTIO].size,
qdev_get_gpio_in(virtio_irqchip, VIRTIO_IRQ + i));
}
@@ -1494,8 +1493,8 @@ static void virt_machine_init(MachineState *machine)
0, qdev_get_gpio_in(mmio_irqchip, UART0_IRQ), 399193,
serial_hd(0), DEVICE_LITTLE_ENDIAN);
- sysbus_create_simple_orphan("goldfish_rtc", s->memmap[VIRT_RTC].base,
- qdev_get_gpio_in(mmio_irqchip, RTC_IRQ));
+ sysbus_create_simple(OBJECT(machine), "rtc", "goldfish_rtc",
+ s->memmap[VIRT_RTC].base, qdev_get_gpio_in(mmio_irqchip, RTC_IRQ));
for (i = 0; i < ARRAY_SIZE(s->flash); i++) {
/* Map legacy -drive if=pflash to machine properties */
@@ -1516,7 +1515,8 @@ static void virt_machine_init(MachineState *machine)
}
if (virt_is_iommu_sys_enabled(s)) {
- DeviceState *iommu_sys = qdev_new_orphan(TYPE_RISCV_IOMMU_SYS);
+ DeviceState *iommu_sys = qdev_new(OBJECT(machine), "iommu",
+ TYPE_RISCV_IOMMU_SYS);
object_property_set_uint(OBJECT(iommu_sys), "addr",
s->memmap[VIRT_IOMMU_SYS].base,
@@ -1535,7 +1535,7 @@ static void virt_machine_init(MachineState *machine)
riscv_is_32bit(&s->soc[0]) ? 34 : 56,
&error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(iommu_sys), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(iommu_sys), &error_fatal);
}
s->machine_done.notify = virt_machine_done;
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 052/134] hw/mips: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (50 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 051/134] hw/riscv: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 053/134] hw/i386: " Alexander Graf
` (82 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/mips to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/mips/boston.c:435 | qdev_new | parent | "pcie[*]" | static helper called 3x from board init; thread Object *parent as first arg
hw/mips/boston.c:691 | qdev_new | OBJECT(machine) | "boston" | board MachineClass.init()
hw/mips/boston.c:773 | pci_create_simple_multifunction | OBJECT(machine) | "ahci" | board MachineClass.init()
hw/mips/fuloong2e.c:289 | pci_new_multifunction | OBJECT(machine) | "via" | board MachineClass.init()
hw/mips/fuloong2e.c:315 | pci_new | OBJECT(machine) | "vga" | board MachineClass.init()
hw/mips/jazz.c:130 | qdev_new | parent | "dp8393x" | static helper called from board init; thread Object *parent as first arg
hw/mips/jazz.c:292 | isa_new | OBJECT(machine) | "pcspk" | board MachineClass.init() helper receiving MachineState*
hw/mips/jazz.c:299 | qdev_new | OBJECT(machine) | "g364" | board MachineClass.init() helper receiving MachineState*
hw/mips/jazz.c:316 | qdev_new | OBJECT(machine) | "vga" | board MachineClass.init() helper receiving MachineState*
hw/mips/jazz.c:332 | qdev_new | OBJECT(machine) | "esp" | board MachineClass.init() helper receiving MachineState*
hw/mips/jazz.c:363 | qdev_new | OBJECT(machine) | "i8042" | board MachineClass.init() helper receiving MachineState*
hw/mips/jazz.c:393 | qdev_new | OBJECT(machine) | "nvram" | board MachineClass.init() helper receiving MachineState*
hw/mips/jazz.c:399 | sysbus_create_simple | OBJECT(machine) | "led" | board MachineClass.init() helper receiving MachineState*
hw/mips/loongson3_virt.c:427 | qdev_new | OBJECT(machine) | "pcie" | inline helper receiving MachineState* from board init
hw/mips/loongson3_virt.c:468 | pci_create_simple | OBJECT(machine) | "ohci" | inline helper receiving MachineState* from board init
hw/mips/loongson3_virt.c:471 | usb_create_simple | OBJECT(machine) | "usb-kbd" | inline helper receiving MachineState* from board init
hw/mips/loongson3_virt.c:472 | usb_create_simple | OBJECT(machine) | "usb-tablet" | inline helper receiving MachineState* from board init
hw/mips/loongson3_virt.c:522 | qdev_new | OBJECT(machine) | "ipi" | board MachineClass.init()
hw/mips/loongson3_virt.c:530 | qdev_new | OBJECT(machine) | "liointc" | board MachineClass.init()
hw/mips/loongson3_virt.c:539 | sysbus_create_simple | OBJECT(machine) | "rtc" | board MachineClass.init()
hw/mips/malta.c:1101 | qdev_new | OBJECT(machine) | "malta" | board MachineClass.init()
hw/mips/malta.c:1230 | qdev_new | OBJECT(machine) | "gt64120" | board MachineClass.init()
hw/mips/malta.c:1237 | pci_new_multifunction | OBJECT(machine) | "piix4" | board MachineClass.init()
hw/mips/malta.c:1257 | isa_create_simple | OBJECT(machine) | "superio" | board MachineClass.init()
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/mips/boston.c | 21 +++++++++++----------
hw/mips/fuloong2e.c | 9 +++++----
hw/mips/jazz.c | 36 +++++++++++++++++++-----------------
hw/mips/loongson3_virt.c | 22 ++++++++++++----------
hw/mips/malta.c | 16 +++++++++-------
5 files changed, 56 insertions(+), 48 deletions(-)
diff --git a/hw/mips/boston.c b/hw/mips/boston.c
index 770160c4e5..a156b218fb 100644
--- a/hw/mips/boston.c
+++ b/hw/mips/boston.c
@@ -424,7 +424,7 @@ static const struct fit_loader boston_fit_loader = {
};
static inline XilinxPCIEHost *
-xilinx_pcie_init(MemoryRegion *sys_mem, uint32_t bus_nr,
+xilinx_pcie_init(Object *parent, MemoryRegion *sys_mem, uint32_t bus_nr,
hwaddr cfg_base, uint64_t cfg_size,
hwaddr mmio_base, uint64_t mmio_size,
qemu_irq irq)
@@ -432,7 +432,7 @@ xilinx_pcie_init(MemoryRegion *sys_mem, uint32_t bus_nr,
DeviceState *dev;
MemoryRegion *cfg, *mmio;
- dev = qdev_new_orphan(TYPE_XILINX_PCIE_HOST);
+ dev = qdev_new(parent, "pcie[*]", TYPE_XILINX_PCIE_HOST);
qdev_prop_set_uint32(dev, "bus_nr", bus_nr);
qdev_prop_set_uint64(dev, "cfg_base", cfg_base);
@@ -440,7 +440,7 @@ xilinx_pcie_init(MemoryRegion *sys_mem, uint32_t bus_nr,
qdev_prop_set_uint64(dev, "mmio_base", mmio_base);
qdev_prop_set_uint64(dev, "mmio_size", mmio_size);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
cfg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
memory_region_add_subregion_overlap(sys_mem, cfg_base, cfg, 0);
@@ -688,8 +688,8 @@ static void boston_mach_init(MachineState *machine)
exit(1);
}
- dev = qdev_new_orphan(TYPE_BOSTON);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(machine), "boston", TYPE_BOSTON);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
s = BOSTON(dev);
s->mach = machine;
@@ -727,21 +727,21 @@ static void boston_mach_init(MachineState *machine)
MIN(machine->ram_size, (256 * MiB)));
memory_region_add_subregion_overlap(sys_mem, 0, ddr_low_alias, 0);
- xilinx_pcie_init(sys_mem, 0,
+ xilinx_pcie_init(OBJECT(machine), sys_mem, 0,
boston_memmap[BOSTON_PCIE0].base,
boston_memmap[BOSTON_PCIE0].size,
boston_memmap[BOSTON_PCIE0_MMIO].base,
boston_memmap[BOSTON_PCIE0_MMIO].size,
get_cps_irq(&s->cps, 2));
- xilinx_pcie_init(sys_mem, 1,
+ xilinx_pcie_init(OBJECT(machine), sys_mem, 1,
boston_memmap[BOSTON_PCIE1].base,
boston_memmap[BOSTON_PCIE1].size,
boston_memmap[BOSTON_PCIE1_MMIO].base,
boston_memmap[BOSTON_PCIE1_MMIO].size,
get_cps_irq(&s->cps, 1));
- pcie2 = xilinx_pcie_init(sys_mem, 2,
+ pcie2 = xilinx_pcie_init(OBJECT(machine), sys_mem, 2,
boston_memmap[BOSTON_PCIE2].base,
boston_memmap[BOSTON_PCIE2].size,
boston_memmap[BOSTON_PCIE2_MMIO].base,
@@ -770,8 +770,9 @@ static void boston_mach_init(MachineState *machine)
qemu_chr_fe_set_handlers(&s->lcd_display, NULL, NULL,
boston_lcd_event, NULL, s, NULL, true);
- pdev = pci_create_simple_multifunction_orphan(&PCI_BRIDGE(&pcie2->root)->sec_bus,
- PCI_DEVFN(0, 0), TYPE_ICH9_AHCI);
+ pdev = pci_create_simple_multifunction(OBJECT(machine), "ahci",
+ &PCI_BRIDGE(&pcie2->root)->sec_bus,
+ PCI_DEVFN(0, 0), TYPE_ICH9_AHCI);
ich9 = ICH9_AHCI(pdev);
g_assert(ARRAY_SIZE(hd) == ich9->ahci.ports);
ide_drive_get(hd, ich9->ahci.ports);
diff --git a/hw/mips/fuloong2e.c b/hw/mips/fuloong2e.c
index 0046423d40..88d2901829 100644
--- a/hw/mips/fuloong2e.c
+++ b/hw/mips/fuloong2e.c
@@ -286,7 +286,8 @@ static void mips_fuloong2e_init(MachineState *machine)
pci_bus = bonito_init(OBJECT(machine), (qemu_irq *)&(env->irq[2]));
/* South bridge -> IP5 */
- pci_dev = pci_new_multifunction_orphan(PCI_DEVFN(FULOONG2E_VIA_SLOT, 0),
+ pci_dev = pci_new_multifunction(OBJECT(machine), "via",
+ PCI_DEVFN(FULOONG2E_VIA_SLOT, 0),
TYPE_VT82C686B_ISA);
/* Set properties on individual devices before realizing the south bridge */
@@ -295,7 +296,7 @@ static void mips_fuloong2e_init(MachineState *machine)
qdev_prop_set_string(dev, "audiodev", machine->audiodev);
}
- pci_realize_and_unref(pci_dev, pci_bus, &error_abort);
+ qdev_realize(DEVICE(pci_dev), BUS(pci_bus), &error_abort);
object_property_add_alias(OBJECT(machine), "rtc-time",
object_resolve_path_component(OBJECT(pci_dev),
@@ -312,12 +313,12 @@ static void mips_fuloong2e_init(MachineState *machine)
/* GPU */
if (vga_interface_type != VGA_NONE) {
vga_interface_created = true;
- pci_dev = pci_new_orphan(-1, "ati-vga");
+ pci_dev = pci_new(OBJECT(machine), "vga", -1, "ati-vga");
dev = DEVICE(pci_dev);
qdev_prop_set_uint32(dev, "vgamem_mb", 16);
qdev_prop_set_uint16(dev, "x-device-id", 0x5159);
qdev_prop_set_uint64(dev, "x-linear-aper-size", 16 * MiB);
- pci_realize_and_unref(pci_dev, pci_bus, &error_fatal);
+ qdev_realize(DEVICE(pci_dev), BUS(pci_bus), &error_fatal);
}
/* Populate SPD eeprom data */
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index 31ef357554..208e59fbeb 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -113,7 +113,8 @@ static const MemoryRegionOps dma_dummy_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
-static void mips_jazz_init_net(IOMMUMemoryRegion *rc4030_dma_mr,
+static void mips_jazz_init_net(Object *parent,
+ IOMMUMemoryRegion *rc4030_dma_mr,
DeviceState *rc4030, MemoryRegion *dp8393x_prom)
{
DeviceState *dev;
@@ -127,14 +128,14 @@ static void mips_jazz_init_net(IOMMUMemoryRegion *rc4030_dma_mr,
return;
}
- dev = qdev_new_orphan("dp8393x");
+ dev = qdev_new(parent, "dp8393x", "dp8393x");
qdev_set_nic_properties(dev, nd);
qdev_prop_set_uint8(dev, "it_shift", 2);
qdev_prop_set_bit(dev, "big_endian", TARGET_BIG_ENDIAN);
object_property_set_link(OBJECT(dev), "dma_mr",
OBJECT(rc4030_dma_mr), &error_abort);
sysbus = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
sysbus_mmio_map(sysbus, 0, 0x80001000);
sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(rc4030, 4));
@@ -289,16 +290,16 @@ static void mips_jazz_init(MachineState *machine,
isa_bus_register_input_irqs(isa_bus, i8259);
i8257_dma_init(OBJECT(rc4030), isa_bus, 0);
pit = i8254_pit_init(isa_bus, 0x40, 0, NULL);
- pcspk = isa_new_orphan(TYPE_PC_SPEAKER);
+ pcspk = isa_new(OBJECT(machine), "pcspk", TYPE_PC_SPEAKER);
object_property_set_link(OBJECT(pcspk), "pit", OBJECT(pit), &error_fatal);
- isa_realize_and_unref(pcspk, isa_bus, &error_fatal);
+ qdev_realize(DEVICE(pcspk), BUS(isa_bus), &error_fatal);
/* Video card */
switch (jazz_model) {
case JAZZ_MAGNUM:
- dev = qdev_new_orphan("sysbus-g364");
+ dev = qdev_new(OBJECT(machine), "g364", "sysbus-g364");
sysbus = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
sysbus_mmio_map(sysbus, 0, 0x60080000);
sysbus_mmio_map(sysbus, 1, 0x40000000);
sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(rc4030, 3));
@@ -313,10 +314,10 @@ static void mips_jazz_init(MachineState *machine,
}
break;
case JAZZ_PICA61:
- dev = qdev_new_orphan(TYPE_VGA_MMIO);
+ dev = qdev_new(OBJECT(machine), "vga", TYPE_VGA_MMIO);
qdev_prop_set_uint8(dev, "it_shift", 0);
sysbus = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
sysbus_mmio_map(sysbus, 0, 0x60000000);
sysbus_mmio_map(sysbus, 1, 0x400a0000);
sysbus_mmio_map(sysbus, 2, VBE_DISPI_LFB_PHYSICAL_ADDRESS);
@@ -326,10 +327,10 @@ static void mips_jazz_init(MachineState *machine,
}
/* Network controller */
- mips_jazz_init_net(rc4030_dma_mr, rc4030, dp8393x_prom);
+ mips_jazz_init_net(OBJECT(machine), rc4030_dma_mr, rc4030, dp8393x_prom);
/* SCSI adapter */
- dev = qdev_new_orphan(TYPE_SYSBUS_ESP);
+ dev = qdev_new(OBJECT(machine), "esp", TYPE_SYSBUS_ESP);
sysbus_esp = SYSBUS_ESP(dev);
esp = &sysbus_esp->esp;
esp->dma_memory_read = rc4030_dma_read;
@@ -340,7 +341,7 @@ static void mips_jazz_init(MachineState *machine,
esp->dma_enabled = 1;
sysbus = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(rc4030, 5));
sysbus_mmio_map(sysbus, 0, 0x80002000);
@@ -360,10 +361,10 @@ static void mips_jazz_init(MachineState *machine,
memory_region_add_subregion(address_space, 0x80004000, rtc);
/* Keyboard (i8042) */
- i8042 = I8042_MMIO(qdev_new_orphan(TYPE_I8042_MMIO));
+ i8042 = I8042_MMIO(qdev_new(OBJECT(machine), "i8042", TYPE_I8042_MMIO));
qdev_prop_set_uint64(DEVICE(i8042), "mask", 1);
qdev_prop_set_uint32(DEVICE(i8042), "size", 0x1000);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(i8042), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(i8042), &error_fatal);
qdev_connect_gpio_out(DEVICE(i8042), I8042_KBD_IRQ,
qdev_get_gpio_in(rc4030, 6));
@@ -390,13 +391,14 @@ static void mips_jazz_init(MachineState *machine,
/* FIXME: missing Jazz sound at 0x8000c000, rc4030[2] */
/* NVRAM */
- dev = qdev_new_orphan("ds1225y");
+ dev = qdev_new(OBJECT(machine), "nvram", "ds1225y");
sysbus = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
sysbus_mmio_map(sysbus, 0, 0x80009000);
/* LED indicator */
- sysbus_create_simple_orphan("jazz-led", 0x8000f000, NULL);
+ sysbus_create_simple(OBJECT(machine), "led", "jazz-led",
+ 0x8000f000, NULL);
g_free(dmas);
}
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index 6f2ac8ba90..9ab1edceb2 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -424,8 +424,8 @@ static inline void loongson3_virt_devices_init(MachineState *machine,
MachineClass *mc = MACHINE_GET_CLASS(machine);
LoongsonMachineState *s = LOONGSON_MACHINE(machine);
- dev = qdev_new_orphan(TYPE_GPEX_HOST);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(machine), "pcie", TYPE_GPEX_HOST);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
pci_bus = PCI_HOST_BRIDGE(dev)->bus;
s->ecam_alias = g_new0(MemoryRegion, 1);
@@ -465,11 +465,12 @@ static inline void loongson3_virt_devices_init(MachineState *machine,
if (defaults_enabled() && object_class_by_name("pci-ohci")) {
USBBus *usb_bus;
- pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
+ pci_create_simple(OBJECT(machine), "ohci", pci_bus, -1, "pci-ohci");
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
- usb_create_simple_orphan(usb_bus, "usb-kbd");
- usb_create_simple_orphan(usb_bus, "usb-tablet");
+ usb_create_simple(OBJECT(machine), "usb-kbd", usb_bus, "usb-kbd");
+ usb_create_simple(OBJECT(machine), "usb-tablet", usb_bus,
+ "usb-tablet");
}
pci_init_nic_devices(pci_bus, mc->default_nic);
@@ -519,16 +520,16 @@ static void mips_loongson3_virt_init(MachineState *machine)
memory_region_init(iocsr, OBJECT(machine), "loongson3.iocsr", UINT32_MAX);
- ipi = qdev_new_orphan(TYPE_LOONGSON_IPI);
+ ipi = qdev_new(OBJECT(machine), "ipi", TYPE_LOONGSON_IPI);
qdev_prop_set_uint32(ipi, "num-cpu", machine->smp.cpus);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(ipi), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(ipi), &error_fatal);
memory_region_add_subregion(iocsr, SMP_IPI_MAILBOX,
sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi), 0));
memory_region_add_subregion(iocsr, MAIL_SEND_ADDR,
sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi), 1));
- liointc = qdev_new_orphan("loongson.liointc");
- sysbus_realize_and_unref(SYS_BUS_DEVICE(liointc), &error_fatal);
+ liointc = qdev_new(OBJECT(machine), "liointc", "loongson.liointc");
+ sysbus_realize(SYS_BUS_DEVICE(liointc), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(liointc), 0, virt_memmap[VIRT_LIOINTC].base);
@@ -536,7 +537,8 @@ static void mips_loongson3_virt_init(MachineState *machine)
qdev_get_gpio_in(liointc, UART_IRQ), 115200, serial_hd(0),
DEVICE_LITTLE_ENDIAN);
- sysbus_create_simple_orphan("goldfish_rtc", virt_memmap[VIRT_RTC].base,
+ sysbus_create_simple(OBJECT(machine), "rtc", "goldfish_rtc",
+ virt_memmap[VIRT_RTC].base,
qdev_get_gpio_in(liointc, RTC_IRQ));
cpuclk = clock_new(OBJECT(machine), "cpu-refclk");
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index ea11299af8..ebd1456657 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -1098,8 +1098,8 @@ void mips_malta_init(MachineState *machine)
PCIDevice *piix4;
DeviceState *dev;
- s = MIPS_MALTA(qdev_new_orphan(TYPE_MIPS_MALTA));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(s), &error_fatal);
+ s = MIPS_MALTA(qdev_new(OBJECT(machine), "malta", TYPE_MIPS_MALTA));
+ sysbus_realize(SYS_BUS_DEVICE(s), &error_fatal);
/* create CPU */
mips_create_cpu(machine, s, &cbus_irq, &i8259_irq);
@@ -1227,16 +1227,17 @@ void mips_malta_init(MachineState *machine)
stl_p(memory_region_get_ram_ptr(bios_copy) + 0x10, 0x00000420);
/* Northbridge */
- dev = qdev_new_orphan("gt64120");
+ dev = qdev_new(OBJECT(machine), "gt64120", "gt64120");
qdev_prop_set_bit(dev, "cpu-little-endian", !TARGET_BIG_ENDIAN);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci"));
pci_bus_map_irqs(pci_bus, malta_pci_slot_get_pirq);
/* Southbridge */
- piix4 = pci_new_multifunction_orphan(PIIX4_PCI_DEVFN, TYPE_PIIX4_PCI_DEVICE);
+ piix4 = pci_new_multifunction(OBJECT(machine), "piix4",
+ PIIX4_PCI_DEVFN, TYPE_PIIX4_PCI_DEVICE);
qdev_prop_set_uint32(DEVICE(piix4), "smb_io_base", 0x1100);
- pci_realize_and_unref(piix4, pci_bus, &error_fatal);
+ qdev_realize(DEVICE(piix4), BUS(pci_bus), &error_fatal);
isa_bus = ISA_BUS(qdev_get_child_bus(DEVICE(piix4), "isa.0"));
dev = DEVICE(object_resolve_path_component(OBJECT(piix4), "ide"));
@@ -1254,7 +1255,8 @@ void mips_malta_init(MachineState *machine)
g_free(smbus_eeprom_buf);
/* Super I/O: SMS FDC37M817 */
- isa_create_simple_orphan(isa_bus, TYPE_FDC37M81X_SUPERIO);
+ isa_create_simple(OBJECT(machine), "superio", isa_bus,
+ TYPE_FDC37M81X_SUPERIO);
/* Network card */
network_init(pci_bus);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 053/134] hw/i386: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (51 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 052/134] hw/mips: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 054/134] hw/ppc: " Alexander Graf
` (81 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/i386 to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
Six of the singletons in hw/i386/kvm/ (kvmclock, xen-evtchn,
xen-gnttab, xen-overlay, xen-xenstore, xen-primary-console) are
created via a public helper; those helpers gain an Object *parent
first argument and all callers are updated in this patch.
The pcspk device created in pc_machine_initfn() is left orphan for
now: it is created in instance_init and object_unref()ed in
instance_finalize when never realized. Making it a child<> would
free it via object_property_del_all() before finalize runs, leaving
finalize with a dangling pointer. This site needs a separate
refactor of pc_machine_finalize() first.
Per-site rationale (reviewers: dispute the modeling here):
hw/i386/isapc.c:115 | isa_new | OBJECT(machine) | "rtc" | board init pc_init_isa()
hw/i386/kvm/clock.c:380 | sysbus_create_simple | parent | "kvmclock" | thread Object *parent into kvmclock_create(); callers pass OBJECT(machine)/OBJECT(mms)
hw/i386/kvm/xen_evtchn.c:309 | sysbus_create_simple | parent | "xen-evtchn" | thread Object *parent into xen_evtchn_create(); caller pc_basic_device_init passes OBJECT(pcms)
hw/i386/kvm/xen_gnttab.c:155 | sysbus_create_simple | parent | "xen-gnttab" | thread Object *parent into xen_gnttab_create(); caller passes OBJECT(pcms)
hw/i386/kvm/xen_overlay.c:172 | sysbus_create_simple | parent | "xen-overlay" | thread Object *parent into xen_overlay_create(); caller passes OBJECT(pcms)
hw/i386/kvm/xen_primary_console.c:87 | sysbus_create_simple | parent | "xen-primary-console" | thread Object *parent into xen_primary_console_create(); callers: pc.c stub-guarded, xen_console_realize passes OBJECT(xendev)
hw/i386/kvm/xen_xenstore.c:279 | sysbus_create_simple | parent | "xen-xenstore" | thread Object *parent into xen_xenstore_create(); caller passes OBJECT(pcms)
hw/i386/microvm.c:111 | qdev_new | OBJECT(mms) | "gpex" | board helper create_gpex(MicrovmMachineState *mms)
hw/i386/microvm.c:200 | sysbus_create_simple | OBJECT(mms) | "virtio-mmio[*]" | board init loop
hw/i386/microvm.c:207 | qdev_new | OBJECT(mms) | "acpi-ged" | board init; already sysbus_realize (no unref), just parent
hw/i386/microvm.c:219 | qdev_new | OBJECT(mms) | "xhci" | board init; already sysbus_realize (no unref), just parent
hw/i386/nitro_enclave.c:49 | qdev_new | OBJECT(nems) | "vsock" | board helper receiving NitroEnclaveMachineState*
hw/i386/nitro_enclave.c:78 | qdev_new | OBJECT(nems) | "nsm" | board helper receiving NitroEnclaveMachineState*
hw/i386/pc.c:1001 | isa_new | parent | "fdc" | pc_superio_init already has Object *parent
hw/i386/pc.c:1017 | isa_create_simple | parent | "i8042" | pc_superio_init already has Object *parent
hw/i386/pc.c:1019 | isa_create_simple | parent | "vmport" | pc_superio_init already has Object *parent
hw/i386/pc.c:1020 | isa_try_new | parent | "vmmouse" | pc_superio_init already has Object *parent
hw/i386/pc.c:1029 | isa_create_simple | parent | "port92" | pc_superio_init already has Object *parent
hw/i386/pc.c:1068 | qdev_try_new | OBJECT(pcms) | "hpet" | pc_basic_device_init receives PCMachineState*
hw/i386/pc.c:1107 | pci_create_simple | OBJECT(pcms) | "xen-platform" | pc_basic_device_init receives PCMachineState*
hw/i386/pc.c:1642 | isa_new | ORPHAN-JUSTIFIED | - | instance_init + explicit unref in instance_finalize; parenting here would double-free via object_property_del_all before finalize; needs separate refactor of pc_machine_finalize
hw/i386/pc_piix.c:196 | qdev_new | OBJECT(machine) | "i440fx" | collapse existing object_property_add_child(machine,"i440fx")
hw/i386/pc_piix.c:239 | pci_new_multifunction | OBJECT(machine) | "south-bridge" | board init pc_init1()
hw/i386/pc_piix.c:387 | pci_create_simple | OBJECT(machine) | "xen-platform" | board init pc_xen_hvm_init()
hw/i386/pc_q35.c:117 | pci_new_multifunction | parent | "ehci[*]" | thread Object *parent into ehci_create_ich9_with_companions(); caller passes OBJECT(machine)
hw/i386/pc_q35.c:122 | pci_new_multifunction | parent | "uhci[*]" | thread Object *parent into ehci_create_ich9_with_companions()
hw/i386/pc_q35.c:202 | qdev_new | OBJECT(machine) | "q35" | collapse existing object_property_add_child(machine,"q35")
hw/i386/pc_q35.c:238 | pci_new_multifunction | OBJECT(machine) | "lpc" | board init pc_q35_init()
hw/i386/pc_q35.c:293 | pci_create_simple_multifunction | OBJECT(machine) | "sata" | board init pc_q35_init()
hw/i386/pc_q35.c:314 | pci_create_simple_multifunction | OBJECT(machine) | "smbus" | board init pc_q35_init()
hw/i386/pc_sysfw.c:82 | qdev_new | OBJECT(pcms) | name | collapse existing object_property_add_child(pcms,name); drop explicit object_unref
hw/i386/sgx.c:314 | qdev_new | OBJECT(pcms) | "sgx-epc[*]" | board helper receiving PCMachineState*
hw/i386/x86-common.c:508 | qdev_new | parent | "ioapic" | collapse existing object_property_add_child(parent,"ioapic")
hw/i386/x86-common.c:510 | qdev_new | parent | "ioapic" | collapse existing object_property_add_child(parent,"ioapic")
hw/i386/x86-common.c:528 | qdev_new | parent | "ioapic2" | thread Object *parent into ioapic_init_secondary(); caller passes OBJECT(mms)
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/char/xen_console.c | 2 +-
hw/i386/isapc.c | 6 +++---
hw/i386/kvm/clock.c | 4 ++--
hw/i386/kvm/clock.h | 2 +-
hw/i386/kvm/xen-stubs.c | 2 +-
hw/i386/kvm/xen_evtchn.c | 6 ++++--
hw/i386/kvm/xen_evtchn.h | 3 ++-
hw/i386/kvm/xen_gnttab.c | 6 ++++--
hw/i386/kvm/xen_gnttab.h | 2 +-
hw/i386/kvm/xen_overlay.c | 6 ++++--
hw/i386/kvm/xen_overlay.h | 2 +-
hw/i386/kvm/xen_primary_console.c | 5 +++--
hw/i386/kvm/xen_primary_console.h | 2 +-
hw/i386/kvm/xen_xenstore.c | 5 +++--
hw/i386/kvm/xen_xenstore.h | 2 +-
hw/i386/microvm.c | 15 ++++++++-------
hw/i386/nitro_enclave.c | 9 +++++----
hw/i386/pc.c | 29 ++++++++++++++--------------
hw/i386/pc_piix.c | 15 ++++++++-------
hw/i386/pc_q35.c | 32 +++++++++++++++++--------------
hw/i386/pc_sysfw.c | 10 ++--------
hw/i386/sgx.c | 5 +++--
hw/i386/x86-common.c | 13 ++++++-------
include/hw/i386/x86.h | 2 +-
24 files changed, 98 insertions(+), 87 deletions(-)
diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c
index 57520192b9..cd440b82f4 100644
--- a/hw/char/xen_console.c
+++ b/hw/char/xen_console.c
@@ -440,7 +440,7 @@ static void xen_console_realize(XenDevice *xendev, Error **errp)
*/
if (!con->dev) {
if (xen_mode == XEN_EMULATE) {
- xen_primary_console_create();
+ xen_primary_console_create(OBJECT(xendev));
} else if (xen_device_frontend_scanf(xendev, "ring-ref", "%u", &u)
!= 1 ||
xen_device_frontend_scanf(xendev, "port", "%u", &u) != 1) {
diff --git a/hw/i386/isapc.c b/hw/i386/isapc.c
index c2a3f23f2c..c5bba66967 100644
--- a/hw/i386/isapc.c
+++ b/hw/i386/isapc.c
@@ -90,7 +90,7 @@ static void pc_init_isa(MachineState *machine)
x86_cpus_init(x86ms, pcmc->default_cpu_version);
if (kvm_enabled()) {
- kvmclock_create(pcmc->kvmclock_create_always);
+ kvmclock_create(OBJECT(machine), pcmc->kvmclock_create_always);
}
/* allocate ram and load rom/bios */
@@ -112,9 +112,9 @@ static void pc_init_isa(MachineState *machine)
&error_abort);
isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
- x86ms->rtc = isa_new_orphan(TYPE_MC146818_RTC);
+ x86ms->rtc = isa_new(OBJECT(machine), "rtc", TYPE_MC146818_RTC);
qdev_prop_set_int32(DEVICE(x86ms->rtc), "base_year", 2000);
- isa_realize_and_unref(x86ms->rtc, isa_bus, &error_fatal);
+ qdev_realize(DEVICE(x86ms->rtc), BUS(isa_bus), &error_fatal);
irq = object_property_get_uint(OBJECT(x86ms->rtc), "irq",
&error_fatal);
isa_connect_gpio_out(ISA_DEVICE(x86ms->rtc), 0, irq);
diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c
index de0df2c82a..34abba88f4 100644
--- a/hw/i386/kvm/clock.c
+++ b/hw/i386/kvm/clock.c
@@ -369,7 +369,7 @@ static const TypeInfo kvmclock_info = {
};
/* Note: Must be called after VCPU initialization. */
-void kvmclock_create(bool create_always)
+void kvmclock_create(Object *parent, bool create_always)
{
X86CPU *cpu = X86_CPU(first_cpu);
@@ -377,7 +377,7 @@ void kvmclock_create(bool create_always)
if (create_always ||
cpu->env.features[FEAT_KVM] & (CPUID_KVM_CLOCK |
CPUID_KVM_CLOCK2)) {
- sysbus_create_simple_orphan(TYPE_KVM_CLOCK, -1, NULL);
+ sysbus_create_simple(parent, "kvmclock", TYPE_KVM_CLOCK, -1, NULL);
}
}
diff --git a/hw/i386/kvm/clock.h b/hw/i386/kvm/clock.h
index 401c7e445b..e86aa3aa88 100644
--- a/hw/i386/kvm/clock.h
+++ b/hw/i386/kvm/clock.h
@@ -13,6 +13,6 @@
#ifndef HW_I386_KVM_CLOCK_H
#define HW_I386_KVM_CLOCK_H
-void kvmclock_create(bool create_always);
+void kvmclock_create(Object *parent, bool create_always);
#endif
diff --git a/hw/i386/kvm/xen-stubs.c b/hw/i386/kvm/xen-stubs.c
index bf6ac28bef..afdceeeb2a 100644
--- a/hw/i386/kvm/xen-stubs.c
+++ b/hw/i386/kvm/xen-stubs.c
@@ -32,7 +32,7 @@ bool xen_evtchn_deliver_pirq_msi(uint64_t address, uint32_t data)
return false;
}
-void xen_primary_console_create(void)
+void xen_primary_console_create(Object *parent)
{
}
diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c
index 1a406fbc00..89e59b612a 100644
--- a/hw/i386/kvm/xen_evtchn.c
+++ b/hw/i386/kvm/xen_evtchn.c
@@ -304,9 +304,11 @@ static void gsi_assert_bh(void *opaque)
}
}
-void xen_evtchn_create(unsigned int nr_gsis, qemu_irq *system_gsis)
+void xen_evtchn_create(Object *parent, unsigned int nr_gsis,
+ qemu_irq *system_gsis)
{
- XenEvtchnState *s = XEN_EVTCHN(sysbus_create_simple_orphan(TYPE_XEN_EVTCHN,
+ XenEvtchnState *s = XEN_EVTCHN(sysbus_create_simple(parent, "xen-evtchn",
+ TYPE_XEN_EVTCHN,
-1, NULL));
int i;
diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h
index 8d339db560..87e9d4bb9f 100644
--- a/hw/i386/kvm/xen_evtchn.h
+++ b/hw/i386/kvm/xen_evtchn.h
@@ -16,7 +16,8 @@
typedef uint32_t evtchn_port_t;
-void xen_evtchn_create(unsigned int nr_gsis, qemu_irq *system_gsis);
+void xen_evtchn_create(Object *parent, unsigned int nr_gsis,
+ qemu_irq *system_gsis);
int xen_evtchn_soft_reset(void);
int xen_evtchn_set_callback_param(uint64_t param);
void xen_evtchn_set_callback_level(int level);
diff --git a/hw/i386/kvm/xen_gnttab.c b/hw/i386/kvm/xen_gnttab.c
index eb43e9f385..ea5a561b05 100644
--- a/hw/i386/kvm/xen_gnttab.c
+++ b/hw/i386/kvm/xen_gnttab.c
@@ -150,9 +150,11 @@ static const TypeInfo xen_gnttab_info = {
.class_init = xen_gnttab_class_init,
};
-void xen_gnttab_create(void)
+void xen_gnttab_create(Object *parent)
{
- xen_gnttab_singleton = XEN_GNTTAB(sysbus_create_simple_orphan(TYPE_XEN_GNTTAB,
+ xen_gnttab_singleton = XEN_GNTTAB(sysbus_create_simple(parent,
+ "xen-gnttab",
+ TYPE_XEN_GNTTAB,
-1, NULL));
}
diff --git a/hw/i386/kvm/xen_gnttab.h b/hw/i386/kvm/xen_gnttab.h
index ee215239b0..6e9c430476 100644
--- a/hw/i386/kvm/xen_gnttab.h
+++ b/hw/i386/kvm/xen_gnttab.h
@@ -12,7 +12,7 @@
#ifndef QEMU_XEN_GNTTAB_H
#define QEMU_XEN_GNTTAB_H
-void xen_gnttab_create(void);
+void xen_gnttab_create(Object *parent);
int xen_gnttab_reset(void);
int xen_gnttab_map_page(uint64_t idx, uint64_t gfn);
diff --git a/hw/i386/kvm/xen_overlay.c b/hw/i386/kvm/xen_overlay.c
index 1ef47539e4..bfa4807427 100644
--- a/hw/i386/kvm/xen_overlay.c
+++ b/hw/i386/kvm/xen_overlay.c
@@ -167,9 +167,11 @@ static const TypeInfo xen_overlay_info = {
.class_init = xen_overlay_class_init,
};
-void xen_overlay_create(void)
+void xen_overlay_create(Object *parent)
{
- xen_overlay_singleton = XEN_OVERLAY(sysbus_create_simple_orphan(TYPE_XEN_OVERLAY,
+ xen_overlay_singleton = XEN_OVERLAY(sysbus_create_simple(parent,
+ "xen-overlay",
+ TYPE_XEN_OVERLAY,
-1, NULL));
/* If xen_domid wasn't explicitly set, at least make sure it isn't zero. */
diff --git a/hw/i386/kvm/xen_overlay.h b/hw/i386/kvm/xen_overlay.h
index 75ecb6b359..37cd86f7ce 100644
--- a/hw/i386/kvm/xen_overlay.h
+++ b/hw/i386/kvm/xen_overlay.h
@@ -12,7 +12,7 @@
#ifndef QEMU_XEN_OVERLAY_H
#define QEMU_XEN_OVERLAY_H
-void xen_overlay_create(void);
+void xen_overlay_create(Object *parent);
int xen_overlay_map_shinfo_page(uint64_t gpa);
void *xen_overlay_get_shinfo_ptr(void);
diff --git a/hw/i386/kvm/xen_primary_console.c b/hw/i386/kvm/xen_primary_console.c
index f22ce4b14b..323b0747a2 100644
--- a/hw/i386/kvm/xen_primary_console.c
+++ b/hw/i386/kvm/xen_primary_console.c
@@ -82,9 +82,10 @@ static const TypeInfo xen_primary_console_info = {
};
-void xen_primary_console_create(void)
+void xen_primary_console_create(Object *parent)
{
- DeviceState *dev = sysbus_create_simple_orphan(TYPE_XEN_PRIMARY_CONSOLE, -1, NULL);
+ DeviceState *dev = sysbus_create_simple(parent, "xen-primary-console",
+ TYPE_XEN_PRIMARY_CONSOLE, -1, NULL);
trace_xen_primary_console_create();
diff --git a/hw/i386/kvm/xen_primary_console.h b/hw/i386/kvm/xen_primary_console.h
index 7e2989ea0d..240c55f0b0 100644
--- a/hw/i386/kvm/xen_primary_console.h
+++ b/hw/i386/kvm/xen_primary_console.h
@@ -12,7 +12,7 @@
#ifndef QEMU_XEN_PRIMARY_CONSOLE_H
#define QEMU_XEN_PRIMARY_CONSOLE_H
-void xen_primary_console_create(void);
+void xen_primary_console_create(Object *parent);
int xen_primary_console_reset(void);
uint16_t xen_primary_console_get_port(void);
diff --git a/hw/i386/kvm/xen_xenstore.c b/hw/i386/kvm/xen_xenstore.c
index 92493bcb6d..1719eab20e 100644
--- a/hw/i386/kvm/xen_xenstore.c
+++ b/hw/i386/kvm/xen_xenstore.c
@@ -274,9 +274,10 @@ static const TypeInfo xen_xenstore_info = {
.class_init = xen_xenstore_class_init,
};
-void xen_xenstore_create(void)
+void xen_xenstore_create(Object *parent)
{
- DeviceState *dev = sysbus_create_simple_orphan(TYPE_XEN_XENSTORE, -1, NULL);
+ DeviceState *dev = sysbus_create_simple(parent, "xen-xenstore",
+ TYPE_XEN_XENSTORE, -1, NULL);
xen_xenstore_singleton = XEN_XENSTORE(dev);
diff --git a/hw/i386/kvm/xen_xenstore.h b/hw/i386/kvm/xen_xenstore.h
index 8c3768e075..a36626e4ff 100644
--- a/hw/i386/kvm/xen_xenstore.h
+++ b/hw/i386/kvm/xen_xenstore.h
@@ -12,7 +12,7 @@
#ifndef QEMU_XEN_XENSTORE_H
#define QEMU_XEN_XENSTORE_H
-void xen_xenstore_create(void);
+void xen_xenstore_create(Object *parent);
int xen_xenstore_reset(void);
uint16_t xen_xenstore_get_port(void);
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 8e52cdd0db..d701672c1a 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -108,8 +108,8 @@ static void create_gpex(MicrovmMachineState *mms)
DeviceState *dev;
int i;
- dev = qdev_new_orphan(TYPE_GPEX_HOST);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(mms), "gpex", TYPE_GPEX_HOST);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
/* Map only the first size_ecam bytes of ECAM space */
ecam_alias = g_new0(MemoryRegion, 1);
@@ -177,11 +177,11 @@ static void microvm_devices_init(MicrovmMachineState *mms)
ioapic_init_gsi(gsi_state, OBJECT(mms));
if (ioapics > 1) {
- x86ms->ioapic2 = ioapic_init_secondary(gsi_state);
+ x86ms->ioapic2 = ioapic_init_secondary(OBJECT(mms), gsi_state);
}
if (kvm_enabled()) {
- kvmclock_create(true);
+ kvmclock_create(OBJECT(mms), true);
}
mms->virtio_irq_base = 5;
@@ -197,14 +197,15 @@ static void microvm_devices_init(MicrovmMachineState *mms)
}
for (i = 0; i < mms->virtio_num_transports; i++) {
- sysbus_create_simple_orphan("virtio-mmio",
+ sysbus_create_simple(OBJECT(mms), "virtio-mmio[*]", "virtio-mmio",
VIRTIO_MMIO_BASE + i * 512,
x86ms->gsi[mms->virtio_irq_base + i]);
}
/* Optional and legacy devices */
if (x86_machine_is_acpi_enabled(x86ms)) {
- DeviceState *dev = qdev_new_orphan(TYPE_ACPI_GED);
+ DeviceState *dev = qdev_new(OBJECT(mms), "acpi-ged",
+ TYPE_ACPI_GED);
qdev_prop_set_uint32(dev, "ged-event", ACPI_GED_PWR_DOWN_EVT);
sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, GED_MMIO_BASE);
@@ -216,7 +217,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
}
if (x86_machine_is_acpi_enabled(x86ms) && machine_usb(MACHINE(mms))) {
- DeviceState *dev = qdev_new_orphan(TYPE_XHCI_SYSBUS);
+ DeviceState *dev = qdev_new(OBJECT(mms), "xhci", TYPE_XHCI_SYSBUS);
qdev_prop_set_uint32(dev, "intrs", 1);
qdev_prop_set_uint32(dev, "slots", XHCI_MAXSLOTS);
qdev_prop_set_uint32(dev, "p2", 8);
diff --git a/hw/i386/nitro_enclave.c b/hw/i386/nitro_enclave.c
index fcad27bd9b..359d83dd49 100644
--- a/hw/i386/nitro_enclave.c
+++ b/hw/i386/nitro_enclave.c
@@ -46,7 +46,8 @@ static BusState *find_free_virtio_mmio_bus(void)
static void vhost_user_vsock_init(NitroEnclaveMachineState *nems)
{
- DeviceState *dev = qdev_new_orphan(TYPE_VHOST_USER_VSOCK);
+ DeviceState *dev = qdev_new(OBJECT(nems), "vsock",
+ TYPE_VHOST_USER_VSOCK);
VHostUserVSock *vsock = VHOST_USER_VSOCK(dev);
BusState *bus;
@@ -70,12 +71,12 @@ static void vhost_user_vsock_init(NitroEnclaveMachineState *nems)
vsock->conf.chardev.chr = chardev;
- qdev_realize_and_unref(dev, bus, &error_fatal);
+ qdev_realize(dev, bus, &error_fatal);
}
static void virtio_nsm_init(NitroEnclaveMachineState *nems)
{
- DeviceState *dev = qdev_new_orphan(TYPE_VIRTIO_NSM);
+ DeviceState *dev = qdev_new(OBJECT(nems), "nsm", TYPE_VIRTIO_NSM);
VirtIONSM *vnsm = VIRTIO_NSM(dev);
BusState *bus = find_free_virtio_mmio_bus();
@@ -86,7 +87,7 @@ static void virtio_nsm_init(NitroEnclaveMachineState *nems)
qdev_prop_set_string(dev, "module-id", nems->id);
- qdev_realize_and_unref(dev, bus, &error_fatal);
+ qdev_realize(dev, bus, &error_fatal);
nems->vnsm = vnsm;
}
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 3d405cb33c..1073888b42 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -998,9 +998,9 @@ static void pc_superio_init(Object *parent, ISABus *isa_bus, bool create_fdctrl,
}
if (create_fdctrl) {
#ifdef CONFIG_FDC_ISA
- ISADevice *fdc = isa_new_orphan(TYPE_ISA_FDC);
+ ISADevice *fdc = isa_new(parent, "fdc", TYPE_ISA_FDC);
if (fdc) {
- isa_realize_and_unref(fdc, isa_bus, &error_fatal);
+ qdev_realize(DEVICE(fdc), BUS(isa_bus), &error_fatal);
isa_fdc_init_drives(fdc, fd);
}
#endif
@@ -1014,19 +1014,19 @@ static void pc_superio_init(Object *parent, ISABus *isa_bus, bool create_fdctrl,
return;
}
- i8042 = isa_create_simple_orphan(isa_bus, TYPE_I8042);
+ i8042 = isa_create_simple(parent, "i8042[*]", isa_bus, TYPE_I8042);
if (!no_vmport) {
- isa_create_simple_orphan(isa_bus, TYPE_VMPORT);
- vmmouse = isa_try_new_orphan("vmmouse");
+ isa_create_simple(parent, "vmport[*]", isa_bus, TYPE_VMPORT);
+ vmmouse = isa_try_new(parent, "vmmouse", "vmmouse");
} else {
vmmouse = NULL;
}
if (vmmouse) {
object_property_set_link(OBJECT(vmmouse), TYPE_I8042, OBJECT(i8042),
&error_abort);
- isa_realize_and_unref(vmmouse, isa_bus, &error_fatal);
+ qdev_realize(DEVICE(vmmouse), BUS(isa_bus), &error_fatal);
}
- port92 = isa_create_simple_orphan(isa_bus, TYPE_PORT92);
+ port92 = isa_create_simple(parent, "port92", isa_bus, TYPE_PORT92);
a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2);
qdev_connect_gpio_out_named(DEVICE(i8042),
@@ -1065,7 +1065,7 @@ void pc_basic_device_init(struct PCMachineState *pcms,
if (pcms->hpet_enabled) {
qemu_irq rtc_irq;
- hpet = qdev_try_new_orphan(TYPE_HPET);
+ hpet = qdev_try_new(OBJECT(pcms), "hpet[*]", TYPE_HPET);
if (!hpet) {
error_report("couldn't create HPET device");
exit(1);
@@ -1080,7 +1080,7 @@ void pc_basic_device_init(struct PCMachineState *pcms,
if (!compat) {
qdev_prop_set_uint32(hpet, HPET_INTCAP, hpet_irqs);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(hpet), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(hpet), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(hpet), 0, HPET_BASE);
for (i = 0; i < IOAPIC_NUM_PINS; i++) {
@@ -1099,12 +1099,13 @@ void pc_basic_device_init(struct PCMachineState *pcms,
#ifdef CONFIG_XEN_EMU
if (xen_mode == XEN_EMULATE) {
- xen_overlay_create();
- xen_evtchn_create(IOAPIC_NUM_PINS, gsi);
- xen_gnttab_create();
- xen_xenstore_create();
+ xen_overlay_create(OBJECT(pcms));
+ xen_evtchn_create(OBJECT(pcms), IOAPIC_NUM_PINS, gsi);
+ xen_gnttab_create(OBJECT(pcms));
+ xen_xenstore_create(OBJECT(pcms));
if (pcms->pcibus) {
- pci_create_simple_orphan(pcms->pcibus, -1, "xen-platform");
+ pci_create_simple(OBJECT(pcms), "xen-platform", pcms->pcibus,
+ -1, "xen-platform");
}
xen_bus_init();
}
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 44ce592ea2..8ae2108e73 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -187,14 +187,13 @@ static void pc_init1(MachineState *machine, const char *pci_type)
x86_cpus_init(x86ms, pcmc->default_cpu_version);
if (kvm_enabled()) {
- kvmclock_create(pcmc->kvmclock_create_always);
+ kvmclock_create(OBJECT(machine), pcmc->kvmclock_create_always);
}
pci_memory = g_new(MemoryRegion, 1);
memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
- phb = OBJECT(qdev_new_orphan(TYPE_I440FX_PCI_HOST_BRIDGE));
- object_property_add_child(OBJECT(machine), "i440fx", phb);
+ phb = OBJECT(qdev_new(OBJECT(machine), "i440fx", TYPE_I440FX_PCI_HOST_BRIDGE));
object_property_set_link(phb, PCI_HOST_PROP_RAM_MEM,
OBJECT(ram_memory), &error_fatal);
object_property_set_link(phb, PCI_HOST_PROP_PCI_MEM,
@@ -209,7 +208,7 @@ static void pc_init1(MachineState *machine, const char *pci_type)
x86ms->above_4g_mem_size, &error_fatal);
object_property_set_str(phb, I440FX_HOST_PROP_PCI_TYPE, pci_type,
&error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(phb), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(phb), &error_fatal);
pcms->pcibus = PCI_BUS(qdev_get_child_bus(DEVICE(phb), "pci.0"));
pci_bus_map_irqs(pcms->pcibus,
@@ -236,7 +235,8 @@ static void pc_init1(MachineState *machine, const char *pci_type)
gsi_state = pc_gsi_create(&x86ms->gsi, true);
- pci_dev = pci_new_multifunction_orphan(-1, pcms->south_bridge);
+ pci_dev = pci_new_multifunction(OBJECT(machine), "south-bridge", -1,
+ pcms->south_bridge);
object_property_set_bool(OBJECT(pci_dev), "has-usb",
machine_usb(machine), &error_abort);
object_property_set_bool(OBJECT(pci_dev), "has-acpi",
@@ -254,7 +254,7 @@ static void pc_init1(MachineState *machine, const char *pci_type)
for (i = 0; i < ISA_NUM_IRQS; i++) {
qdev_connect_gpio_out_named(dev, "isa-irqs", i, x86ms->gsi[i]);
}
- pci_realize_and_unref(pci_dev, pcms->pcibus, &error_fatal);
+ qdev_realize(DEVICE(pci_dev), BUS(pcms->pcibus), &error_fatal);
if (xen_enabled()) {
pci_device_set_intx_routing_notifier(
@@ -384,7 +384,8 @@ static void pc_xen_hvm_init(MachineState *machine)
: TYPE_I440FX_PCI_DEVICE);
xen_igd_reserve_slot(pcms->pcibus);
- pci_create_simple_orphan(pcms->pcibus, -1, "xen-platform");
+ pci_create_simple(OBJECT(machine), "xen-platform", pcms->pcibus, -1,
+ "xen-platform");
}
#endif
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index bfea390825..1a65811fae 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -93,7 +93,8 @@ static const struct ehci_companions ich9_1a[] = {
{ .name = TYPE_ICH9_USB_UHCI(6), .func = 2, .port = 4 },
};
-static int ehci_create_ich9_with_companions(PCIBus *bus, int slot)
+static int ehci_create_ich9_with_companions(Object *parent, PCIBus *bus,
+ int slot)
{
const struct ehci_companions *comp;
PCIDevice *ehci, *uhci;
@@ -114,16 +115,17 @@ static int ehci_create_ich9_with_companions(PCIBus *bus, int slot)
return -1;
}
- ehci = pci_new_multifunction_orphan(PCI_DEVFN(slot, 7), name);
- pci_realize_and_unref(ehci, bus, &error_fatal);
+ ehci = pci_new_multifunction(parent, "ehci[*]", PCI_DEVFN(slot, 7), name);
+ qdev_realize(DEVICE(ehci), BUS(bus), &error_fatal);
usbbus = QLIST_FIRST(&ehci->qdev.child_bus);
for (i = 0; i < 3; i++) {
- uhci = pci_new_multifunction_orphan(PCI_DEVFN(slot, comp[i].func),
+ uhci = pci_new_multifunction(parent, "uhci[*]",
+ PCI_DEVFN(slot, comp[i].func),
comp[i].name);
qdev_prop_set_string(&uhci->qdev, "masterbus", usbbus->name);
qdev_prop_set_uint32(&uhci->qdev, "firstport", comp[i].port);
- pci_realize_and_unref(uhci, bus, &error_fatal);
+ qdev_realize(DEVICE(uhci), BUS(bus), &error_fatal);
}
return 0;
}
@@ -195,11 +197,11 @@ static void pc_q35_init(MachineState *machine)
x86_cpus_init(x86ms, pcmc->default_cpu_version);
if (kvm_enabled()) {
- kvmclock_create(pcmc->kvmclock_create_always);
+ kvmclock_create(OBJECT(machine), pcmc->kvmclock_create_always);
}
/* create pci host bus */
- phb = OBJECT(qdev_new_orphan(TYPE_Q35_HOST_DEVICE));
+ phb = OBJECT(qdev_new(OBJECT(machine), "q35", TYPE_Q35_HOST_DEVICE));
pci_hole64_size = object_property_get_uint(phb,
PCI_HOST_PROP_PCI_HOLE64_SIZE,
@@ -209,7 +211,6 @@ static void pc_q35_init(MachineState *machine)
memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
pc_memory_init(pcms, system_memory, pci_memory, pci_hole64_size);
- object_property_add_child(OBJECT(machine), "q35", phb);
object_property_set_link(phb, PCI_HOST_PROP_RAM_MEM,
OBJECT(machine->ram), NULL);
object_property_set_link(phb, PCI_HOST_PROP_PCI_MEM,
@@ -226,7 +227,7 @@ static void pc_q35_init(MachineState *machine)
pcms->default_bus_bypass_iommu, NULL);
object_property_set_bool(phb, PCI_HOST_PROP_SMM_RANGES,
x86_machine_is_smm_enabled(x86ms), NULL);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(phb), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(phb), &error_fatal);
/* pci */
pcms->pcibus = PCI_BUS(qdev_get_child_bus(DEVICE(phb), "pcie.0"));
@@ -235,7 +236,8 @@ static void pc_q35_init(MachineState *machine)
gsi_state = pc_gsi_create(&x86ms->gsi, true);
/* create ISA bus */
- lpc = pci_new_multifunction_orphan(PCI_DEVFN(ICH9_LPC_DEV, ICH9_LPC_FUNC),
+ lpc = pci_new_multifunction(OBJECT(machine), "lpc",
+ PCI_DEVFN(ICH9_LPC_DEV, ICH9_LPC_FUNC),
TYPE_ICH9_LPC_DEVICE);
lpc_dev = DEVICE(lpc);
qdev_prop_set_bit(lpc_dev, "smm-enabled",
@@ -243,7 +245,7 @@ static void pc_q35_init(MachineState *machine)
for (i = 0; i < IOAPIC_NUM_PINS; i++) {
qdev_connect_gpio_out_named(lpc_dev, ICH9_GPIO_GSI, i, x86ms->gsi[i]);
}
- pci_realize_and_unref(lpc, pcms->pcibus, &error_fatal);
+ qdev_realize(DEVICE(lpc), BUS(pcms->pcibus), &error_fatal);
x86ms->rtc = ISA_DEVICE(object_resolve_path_component(OBJECT(lpc), "rtc"));
@@ -290,7 +292,8 @@ static void pc_q35_init(MachineState *machine)
AHCIPCIState *ich9;
/* ahci and SATA device, for q35 1 ahci controller is built-in */
- pdev = pci_create_simple_multifunction_orphan(pcms->pcibus,
+ pdev = pci_create_simple_multifunction(OBJECT(machine), "sata[*]",
+ pcms->pcibus,
PCI_DEVFN(ICH9_SATA1_DEV,
ICH9_SATA1_FUNC),
"ich9-ahci");
@@ -304,14 +307,15 @@ static void pc_q35_init(MachineState *machine)
if (machine_usb(machine)) {
/* Should we create 6 UHCI according to ich9 spec? */
- ehci_create_ich9_with_companions(pcms->pcibus, 0x1d);
+ ehci_create_ich9_with_companions(OBJECT(machine), pcms->pcibus, 0x1d);
}
if (pcms->smbus_enabled) {
PCIDevice *smb;
/* TODO: Populate SPD eeprom data. */
- smb = pci_create_simple_multifunction_orphan(pcms->pcibus,
+ smb = pci_create_simple_multifunction(OBJECT(machine), "smbus[*]",
+ pcms->pcibus,
PCI_DEVFN(ICH9_SMB_DEV,
ICH9_SMB_FUNC),
TYPE_ICH9_SMB_DEVICE);
diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
index d351e3da77..02d75e2838 100644
--- a/hw/i386/pc_sysfw.c
+++ b/hw/i386/pc_sysfw.c
@@ -79,19 +79,13 @@ static PFlashCFI01 *pc_pflash_create(PCMachineState *pcms,
const char *name,
const char *alias_prop_name)
{
- DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new(OBJECT(pcms), name, TYPE_PFLASH_CFI01);
qdev_prop_set_uint64(dev, "sector-length", FLASH_SECTOR_SIZE);
qdev_prop_set_uint8(dev, "width", 1);
qdev_prop_set_string(dev, "name", name);
- object_property_add_child(OBJECT(pcms), name, OBJECT(dev));
object_property_add_alias(OBJECT(pcms), alias_prop_name,
OBJECT(dev), "drive");
- /*
- * The returned reference is tied to the child property and
- * will be removed with object_unparent.
- */
- object_unref(OBJECT(dev));
return PFLASH_CFI01(dev);
}
@@ -189,7 +183,7 @@ static void pc_system_flash_map(PCMachineState *pcms,
gpa = 0x100000000ULL - total_size; /* where the flash is mapped */
qdev_prop_set_uint32(DEVICE(system_flash), "num-blocks",
size / FLASH_SECTOR_SIZE);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(system_flash), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(system_flash), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(system_flash), 0, gpa);
if (i == 0) {
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
index c326385456..c5a8febf29 100644
--- a/hw/i386/sgx.c
+++ b/hw/i386/sgx.c
@@ -311,7 +311,8 @@ void pc_machine_init_sgx_epc(PCMachineState *pcms)
&sgx_epc->mr);
for (list = x86ms->sgx_epc_list; list; list = list->next) {
- DeviceState *dev = qdev_new_orphan(TYPE_SGX_EPC);
+ DeviceState *dev = qdev_new(OBJECT(pcms), "sgx-epc[*]",
+ TYPE_SGX_EPC);
/* set the memdev link with memory backend */
object_property_parse(OBJECT(dev), SGX_EPC_MEMDEV_PROP,
@@ -319,7 +320,7 @@ void pc_machine_init_sgx_epc(PCMachineState *pcms)
/* set the numa node property for sgx epc object */
object_property_set_uint(OBJECT(dev), SGX_EPC_NUMA_NODE_PROP,
list->value->node, &error_fatal);
- qdev_realize_and_unref(dev, NULL, &error_fatal);
+ qdev_realize(dev, NULL, &error_fatal);
}
if ((sgx_epc->base + sgx_epc->size) < sgx_epc->base) {
diff --git a/hw/i386/x86-common.c b/hw/i386/x86-common.c
index b8e541e376..73a53fbf3f 100644
--- a/hw/i386/x86-common.c
+++ b/hw/i386/x86-common.c
@@ -505,13 +505,12 @@ void ioapic_init_gsi(GSIState *gsi_state, Object *parent)
assert(parent);
if (kvm_ioapic_in_kernel()) {
- dev = qdev_new_orphan(TYPE_KVM_IOAPIC);
+ dev = qdev_new(parent, "ioapic", TYPE_KVM_IOAPIC);
} else {
- dev = qdev_new_orphan(TYPE_IOAPIC);
+ dev = qdev_new(parent, "ioapic", TYPE_IOAPIC);
}
- object_property_add_child(parent, "ioapic", OBJECT(dev));
d = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(d, &error_fatal);
+ sysbus_realize(d, &error_fatal);
sysbus_mmio_map(d, 0, IO_APIC_DEFAULT_ADDRESS);
for (i = 0; i < IOAPIC_NUM_PINS; i++) {
@@ -519,15 +518,15 @@ void ioapic_init_gsi(GSIState *gsi_state, Object *parent)
}
}
-DeviceState *ioapic_init_secondary(GSIState *gsi_state)
+DeviceState *ioapic_init_secondary(Object *parent, GSIState *gsi_state)
{
DeviceState *dev;
SysBusDevice *d;
unsigned int i;
- dev = qdev_new_orphan(TYPE_IOAPIC);
+ dev = qdev_new(parent, "ioapic2[*]", TYPE_IOAPIC);
d = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(d, &error_fatal);
+ sysbus_realize(d, &error_fatal);
sysbus_mmio_map(d, 0, IO_APIC_SECONDARY_ADDRESS);
for (i = 0; i < IOAPIC_NUM_PINS; i++) {
diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
index 71fe6b5e12..61d6ec1755 100644
--- a/include/hw/i386/x86.h
+++ b/include/hw/i386/x86.h
@@ -147,7 +147,7 @@ typedef struct GSIState {
qemu_irq x86_allocate_cpu_irq(void);
void gsi_handler(void *opaque, int n, int level);
void ioapic_init_gsi(GSIState *gsi_state, Object *parent);
-DeviceState *ioapic_init_secondary(GSIState *gsi_state);
+DeviceState *ioapic_init_secondary(Object *parent, GSIState *gsi_state);
/* pc_sysfw.c */
void x86_firmware_configure(hwaddr gpa, void *ptr, int size);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 054/134] hw/ppc: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (52 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 053/134] hw/i386: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 055/134] hw/pci, hw/isa: Give VGA and slot-NIC helpers " Alexander Graf
` (80 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/ppc to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children. Names follow existing QOM conventions.
pnv_bmc_create() and spapr_vio_bus_init() gain an Object *parent
first argument; the callers are updated in this patch.
Per-site rationale (reviewers: dispute the modeling here):
file:line | creator | parent | name | rationale
hw/ppc/amigaone.c:282 | cpu_create | OBJECT(machine) | "cpu" | board init, single CPU
hw/ppc/amigaone.c:305 | qdev_new | OBJECT(machine) | "nvram" | board init
hw/ppc/amigaone.c:332 | sysbus_create_simple | OBJECT(machine) | "articia" | board init, north bridge
hw/ppc/amigaone.c:358 | pci_create_simple_multifunction | OBJECT(machine) | "via" | board init, south bridge
hw/ppc/e500.c:818 | qdev_new | OBJECT(machine) | "pic" | collapse existing add_child; helper receives PPCE500MachineState
hw/ppc/e500.c:843 | qdev_new | parent | "pic" | thread Object *parent into ppce500_init_mpic_kvm(); drop object_unparent on error
hw/ppc/e500.c:996 | qdev_new | OBJECT(machine) | "e500-ccsr" | collapse existing add_child, keep name
hw/ppc/e500.c:1021 | qdev_new | OBJECT(machine) | "i2c" | board init
hw/ppc/e500.c:1028 | i2c_slave_create_simple | OBJECT(machine) | "rtc" | board init, DS1338 RTC
hw/ppc/e500.c:1032 | qdev_new | OBJECT(machine) | "esdhc-stub" | board init, unimplemented placeholder
hw/ppc/e500.c:1040 | qdev_new | OBJECT(machine) | "esdhc" | board init
hw/ppc/e500.c:1049 | qdev_new | OBJECT(machine) | "guts" | board init
hw/ppc/e500.c:1056 | qdev_new | OBJECT(machine) | "pci-host" | collapse existing add_child, keep name
hw/ppc/e500.c:1079 | sysbus_create_simple | OBJECT(machine) | "spin" | board init
hw/ppc/e500.c:1084 | qdev_new | OBJECT(machine) | "gpio" | board init
hw/ppc/e500.c:1097 | qdev_new | OBJECT(machine) | "platform-bus" | board init
hw/ppc/e500.c:1139 | qdev_new | OBJECT(machine) | "flash" | board init
hw/ppc/mac_newworld.c:162 | cpu_create | OBJECT(machine) | "cpu[*]" | board init, SMP loop
hw/ppc/mac_newworld.c:289 | qdev_new | OBJECT(machine) | "uni-n" | board init, UniNorth main
hw/ppc/mac_newworld.c:298 | qdev_new | OBJECT(machine) | "u3-agp" | board init, U3 AGP host
hw/ppc/mac_newworld.c:313 | qdev_new | OBJECT(machine) | "uni-n-agp" | board init
hw/ppc/mac_newworld.c:320 | qdev_new | OBJECT(machine) | "uni-n-internal" | board init
hw/ppc/mac_newworld.c:328 | qdev_new | OBJECT(machine) | "uni-n-pci" | board init
hw/ppc/mac_newworld.c:351 | pci_new | OBJECT(machine) | "macio" | board init
hw/ppc/mac_newworld.c:411 | qdev_new | OBJECT(machine) | "adb-keyboard" | board init
hw/ppc/mac_newworld.c:414 | qdev_new | OBJECT(machine) | "adb-mouse" | board init
hw/ppc/mac_newworld.c:419 | pci_create_simple | OBJECT(machine) | "ohci" | board init
hw/ppc/mac_newworld.c:428 | usb_create_simple | OBJECT(machine) | "usb-kbd" | board init
hw/ppc/mac_newworld.c:429 | usb_create_simple | OBJECT(machine) | "usb-mouse" | board init
hw/ppc/mac_newworld.c:456 | qdev_new | OBJECT(machine) | "nvram" | board init
hw/ppc/mac_newworld.c:465 | qdev_new | OBJECT(machine) | TYPE_FW_CFG | collapse existing add_child, keep name
hw/ppc/mac_oldworld.c:114 | cpu_create | OBJECT(machine) | "cpu[*]" | board init, SMP loop
hw/ppc/mac_oldworld.c:215 | qdev_new | OBJECT(machine) | "grackle" | board init
hw/ppc/mac_oldworld.c:232 | pci_new | OBJECT(machine) | "macio" | board init
hw/ppc/mac_oldworld.c:282 | qdev_new | OBJECT(machine) | "adb-keyboard" | board init
hw/ppc/mac_oldworld.c:284 | qdev_new | OBJECT(machine) | "adb-mouse" | board init
hw/ppc/mac_oldworld.c:288 | pci_create_simple | OBJECT(machine) | "ohci" | board init
hw/ppc/mac_oldworld.c:306 | qdev_new | OBJECT(machine) | TYPE_FW_CFG | collapse existing add_child, keep name
hw/ppc/pegasos.c:166 | cpu_create | OBJECT(machine) | "cpu" | board init, single CPU
hw/ppc/pegasos.c:221 | sysbus_create_simple | OBJECT(machine) | "articia" | board init, north bridge (Pegasos1 branch)
hw/ppc/pegasos.c:236 | sysbus_create_simple | OBJECT(machine) | "mv64361" | board init, north bridge (Pegasos2 branch)
hw/ppc/pegasos.c:244 | pci_new_multifunction | OBJECT(machine) | "via" | board init, south bridge
hw/ppc/pnv.c:1013 | isa_new | parent | "ipmi-bt" | thread Object *parent into pnv_ipmi_bt_init()
hw/ppc/pnv.c:1130 | qdev_new | OBJECT(machine) | "pnor" | board init
hw/ppc/pnv.c:1272 | qdev_new | OBJECT(pnv) | chip_name | collapse existing add_child; move snprintf before create
hw/ppc/pnv.c:2828 | i2c_slave_create_simple | OBJECT(pnv) | "pca9552[*]" | pnv_rainier_i2c_init receives PnvMachineState; per-chip loop
hw/ppc/pnv.c:2846 | i2c_slave_create_simple | OBJECT(pnv) | "pca9554[*]" | pnv_rainier_i2c_init receives PnvMachineState; per-chip loop
hw/ppc/pnv_bmc.c:302 | qdev_new | parent | "bmc" | thread Object *parent into pnv_bmc_create() (+ header, caller)
hw/ppc/ppc440_bamboo.c:151 | cpu_create | OBJECT(machine) | "cpu" | board init, single CPU
hw/ppc/ppc440_bamboo.c:165 | qdev_new | OBJECT(machine) | "uic" | board init; drop object_unref
hw/ppc/ppc440_bamboo.c:175 | qdev_new | OBJECT(machine) | "sdram" | board init; drop object_unref
hw/ppc/ppc440_bamboo.c:186 | sysbus_create_varargs | OBJECT(machine) | "pci-host" | board init
hw/ppc/prep.c:260 | cpu_create | OBJECT(machine) | "cpu" | board init, single CPU
hw/ppc/prep.c:292 | qdev_new | OBJECT(machine) | "raven" | collapse existing add_child(qdev_get_machine())
hw/ppc/prep.c:303 | pci_new | OBJECT(machine) | "i82378" | board init, ISA bridge
hw/ppc/prep.c:312 | isa_new | OBJECT(machine) | "systemio" | board init
hw/ppc/prep.c:319 | isa_new | OBJECT(machine) | "mc" | board init, memory controller
hw/ppc/prep.c:325 | isa_new | OBJECT(machine) | "rtc" | board init
hw/ppc/prep.c:337 | isa_create_simple | OBJECT(machine) | "m48t59" | board init
hw/ppc/prep.c:339 | isa_new | OBJECT(machine) | "cs4231a" | board init, audio
hw/ppc/prep.c:348 | isa_new | OBJECT(machine) | "pc87312" | board init, superio
hw/ppc/prep.c:353 | pci_create_simple | OBJECT(machine) | "scsi" | board init, LSI SCSI
hw/ppc/prep.c:366 | qdev_new | OBJECT(machine) | TYPE_FW_CFG | collapse existing add_child, keep name
hw/ppc/sam460ex.c:264 | cpu_create | OBJECT(machine) | "cpu" | board init, single CPU
hw/ppc/sam460ex.c:279 | qdev_new | OBJECT(machine) | "plb" | board init; drop object_unref
hw/ppc/sam460ex.c:295 | qdev_new | OBJECT(machine) | "uic[*]" | board init loop; drop object_unref
hw/ppc/sam460ex.c:325 | qdev_new | OBJECT(machine) | "sdram" | board init; drop object_unref
hw/ppc/sam460ex.c:340 | sysbus_create_simple | OBJECT(machine) | "i2c[*]" | board init, first IIC
hw/ppc/sam460ex.c:349 | i2c_slave_create_simple | OBJECT(machine) | "rtc" | board init, M41T80 RTC
hw/ppc/sam460ex.c:351 | sysbus_create_simple | OBJECT(machine) | "i2c[*]" | board init, second IIC
hw/ppc/sam460ex.c:355 | qdev_new | OBJECT(machine) | "ebc" | board init; drop object_unref
hw/ppc/sam460ex.c:369 | qdev_new | OBJECT(machine) | "mal" | board init; drop object_unref
hw/ppc/sam460ex.c:391 | sysbus_create_simple | OBJECT(machine) | "ehci" | board init
hw/ppc/sam460ex.c:393 | qdev_new | OBJECT(machine) | "ohci" | board init
hw/ppc/sam460ex.c:402 | usb_create_simple | OBJECT(machine) | "usb-kbd" | board init
hw/ppc/sam460ex.c:403 | usb_create_simple | OBJECT(machine) | "usb-mouse" | board init
hw/ppc/sam460ex.c:406 | qdev_new | OBJECT(machine) | "pcie-host[*]" | board init, first PCIe
hw/ppc/sam460ex.c:412 | qdev_new | OBJECT(machine) | "pcie-host[*]" | board init, second PCIe
hw/ppc/sam460ex.c:420 | sysbus_create_simple | OBJECT(machine) | "pcix-host" | board init
hw/ppc/sam460ex.c:426 | pci_create_simple | OBJECT(machine) | "sm501" | board init, display
hw/ppc/sam460ex.c:433 | pci_create_simple | OBJECT(machine) | "sata" | board init, SiI3112 SATA
hw/ppc/spapr.c:1888 | qdev_new | OBJECT(spapr) | "nvram" | helper receives SpaprMachineState
hw/ppc/spapr.c:2802 | qdev_new | parent | "phb[*]" | thread Object *parent into spapr_create_default_phb()
hw/ppc/spapr.c:3078 | pci_create_simple | OBJECT(machine) | "xhci" | board init
hw/ppc/spapr.c:3085 | usb_create_simple | OBJECT(machine) | "usb-kbd" | board init
hw/ppc/spapr.c:3086 | usb_create_simple | OBJECT(machine) | "usb-mouse" | board init
hw/ppc/spapr_irq.c:315 | qdev_new | OBJECT(spapr) | "xive" | spapr_irq_init receives SpaprMachineState
hw/ppc/spapr_vio.c:567 | qdev_new | parent | "vio-bridge" | thread Object *parent into spapr_vio_bus_init() (+ header, caller)
hw/ppc/virtex_ml507.c:79 | cpu_create | parent | "cpu" | thread Object *parent into ppc440_init_xilinx()
hw/ppc/virtex_ml507.c:87 | qdev_new | parent | "uic" | ppc440_init_xilinx(); drop object_unref
hw/ppc/virtex_ml507.c:221 | qdev_new | OBJECT(machine) | "intc" | board init
hw/ppc/virtex_ml507.c:236 | qdev_new | OBJECT(machine) | "timer" | board init
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/ppc/amigaone.c | 12 ++++----
hw/ppc/e500.c | 58 +++++++++++++++++++-------------------
hw/ppc/mac_newworld.c | 54 +++++++++++++++++++----------------
hw/ppc/mac_oldworld.c | 28 +++++++++---------
hw/ppc/pegasos.c | 13 +++++----
hw/ppc/pnv.c | 29 ++++++++++---------
hw/ppc/pnv_bmc.c | 4 +--
hw/ppc/ppc440_bamboo.c | 11 ++++----
hw/ppc/prep.c | 44 ++++++++++++++---------------
hw/ppc/sam460ex.c | 55 +++++++++++++++++-------------------
hw/ppc/spapr.c | 21 +++++++-------
hw/ppc/spapr_irq.c | 4 +--
hw/ppc/spapr_vio.c | 6 ++--
hw/ppc/virtex_ml507.c | 18 ++++++------
include/hw/ppc/pnv.h | 2 +-
include/hw/ppc/spapr_vio.h | 2 +-
16 files changed, 186 insertions(+), 175 deletions(-)
diff --git a/hw/ppc/amigaone.c b/hw/ppc/amigaone.c
index 866e5547d6..faf76f12be 100644
--- a/hw/ppc/amigaone.c
+++ b/hw/ppc/amigaone.c
@@ -279,7 +279,7 @@ static void amigaone_init(MachineState *machine)
struct boot_info *bi = NULL;
/* init CPU */
- cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = POWERPC_CPU(cpu_create(OBJECT(machine), "cpu", machine->cpu_type));
env = &cpu->env;
if (PPC_INPUT(env) != PPC_FLAGS_INPUT_6xx) {
error_report("Incompatible CPU, only 6xx bus supported");
@@ -302,12 +302,12 @@ static void amigaone_init(MachineState *machine)
}
/* nvram */
- dev = qdev_new_orphan(TYPE_A1_NVRAM);
+ dev = qdev_new(OBJECT(machine), "nvram", TYPE_A1_NVRAM);
di = drive_get(IF_MTD, 0, 0);
if (di) {
qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(di));
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
memory_region_add_subregion(get_system_memory(), NVRAM_ADDR,
sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0));
@@ -329,7 +329,8 @@ static void amigaone_init(MachineState *machine)
}
/* Articia S */
- dev = sysbus_create_simple_orphan(TYPE_ARTICIA, ARTICIA_ADDR, NULL);
+ dev = sysbus_create_simple(OBJECT(machine), "articia", TYPE_ARTICIA,
+ ARTICIA_ADDR, NULL);
i2c_bus = I2C_BUS(qdev_get_child_bus(dev, "smbus"));
if (machine->ram_size > 512 * MiB) {
@@ -355,7 +356,8 @@ static void amigaone_init(MachineState *machine)
pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci.0"));
/* VIA VT82c686B South Bridge (multifunction PCI device) */
- via = OBJECT(pci_create_simple_multifunction_orphan(pci_bus, PCI_DEVFN(7, 0),
+ via = OBJECT(pci_create_simple_multifunction(OBJECT(machine), "via",
+ pci_bus, PCI_DEVFN(7, 0),
TYPE_VT82C686B_ISA));
object_property_add_alias(OBJECT(machine), "rtc-time",
object_resolve_path_component(via, "rtc"),
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index f7a7c136da..21e656e87f 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -815,13 +815,12 @@ static DeviceState *ppce500_init_mpic_qemu(PPCE500MachineState *pms,
unsigned int smp_cpus = machine->smp.cpus;
const PPCE500MachineClass *pmc = PPCE500_MACHINE_GET_CLASS(pms);
- dev = qdev_new_orphan(TYPE_OPENPIC);
- object_property_add_child(OBJECT(machine), "pic", OBJECT(dev));
+ dev = qdev_new(OBJECT(machine), "pic", TYPE_OPENPIC);
qdev_prop_set_uint32(dev, "model", pmc->mpic_version);
qdev_prop_set_uint32(dev, "nb_cpus", smp_cpus);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
k = 0;
for (i = 0; i < smp_cpus; i++) {
@@ -833,17 +832,18 @@ static DeviceState *ppce500_init_mpic_qemu(PPCE500MachineState *pms,
return dev;
}
-static DeviceState *ppce500_init_mpic_kvm(const PPCE500MachineClass *pmc,
+static DeviceState *ppce500_init_mpic_kvm(Object *parent,
+ const PPCE500MachineClass *pmc,
Error **errp)
{
#ifdef CONFIG_KVM
DeviceState *dev;
CPUState *cs;
- dev = qdev_new_orphan(TYPE_KVM_OPENPIC);
+ dev = qdev_new(parent, "pic", TYPE_KVM_OPENPIC);
qdev_prop_set_uint32(dev, "model", pmc->mpic_version);
- if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp)) {
+ if (!sysbus_realize(SYS_BUS_DEVICE(dev), errp)) {
object_unparent(OBJECT(dev));
return NULL;
}
@@ -874,7 +874,7 @@ static DeviceState *ppce500_init_mpic(PPCE500MachineState *pms,
Error *err = NULL;
if (kvm_kernel_irqchip_allowed()) {
- dev = ppce500_init_mpic_kvm(pmc, &err);
+ dev = ppce500_init_mpic_kvm(OBJECT(pms), pmc, &err);
}
if (kvm_kernel_irqchip_required() && !dev) {
error_reportf_err(err,
@@ -993,10 +993,9 @@ void ppce500_init(MachineState *machine)
/* Register Memory */
memory_region_add_subregion(address_space_mem, 0, machine->ram);
- dev = qdev_new_orphan("e500-ccsr");
+ dev = qdev_new(OBJECT(machine), "e500-ccsr", "e500-ccsr");
s = SYS_BUS_DEVICE(dev);
- object_property_add_child(OBJECT(machine), "e500-ccsr", OBJECT(dev));
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
ccsr_addr_space = sysbus_mmio_get_region(s, 0);
memory_region_add_subregion(address_space_mem, pmc->ccsrbar_base,
ccsr_addr_space);
@@ -1018,47 +1017,47 @@ void ppce500_init(MachineState *machine)
}
/* I2C */
- dev = qdev_new_orphan("mpc-i2c");
+ dev = qdev_new(OBJECT(machine), "i2c", "mpc-i2c");
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(mpicdev, MPC8544_I2C_IRQ));
memory_region_add_subregion(ccsr_addr_space, MPC8544_I2C_REGS_OFFSET,
sysbus_mmio_get_region(s, 0));
i2c = I2C_BUS(qdev_get_child_bus(dev, "i2c"));
- i2c_slave_create_simple_orphan(i2c, "ds1338", RTC_REGS_OFFSET);
+ i2c_slave_create_simple(OBJECT(machine), "rtc", i2c, "ds1338",
+ RTC_REGS_OFFSET);
/* eSDHC */
if (pmc->has_esdhc) {
- dev = qdev_new_orphan(TYPE_UNIMPLEMENTED_DEVICE);
+ dev = qdev_new(OBJECT(machine), "esdhc-stub", TYPE_UNIMPLEMENTED_DEVICE);
qdev_prop_set_string(dev, "name", "esdhc");
qdev_prop_set_uint64(dev, "size", MPC85XX_ESDHC_REGS_SIZE);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
memory_region_add_subregion(ccsr_addr_space, MPC85XX_ESDHC_REGS_OFFSET,
sysbus_mmio_get_region(s, 0));
- dev = qdev_new_orphan(TYPE_FSL_ESDHC_BE);
+ dev = qdev_new(OBJECT(machine), "esdhc", TYPE_FSL_ESDHC_BE);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(mpicdev, MPC85XX_ESDHC_IRQ));
memory_region_add_subregion(ccsr_addr_space, MPC85XX_ESDHC_REGS_OFFSET,
sysbus_mmio_get_region(s, 0));
}
/* General Utility device */
- dev = qdev_new_orphan("mpc8544-guts");
+ dev = qdev_new(OBJECT(machine), "guts", "mpc8544-guts");
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
memory_region_add_subregion(ccsr_addr_space, MPC8544_UTIL_OFFSET,
sysbus_mmio_get_region(s, 0));
/* PCI */
- dev = qdev_new_orphan("e500-pcihost");
- object_property_add_child(OBJECT(machine), "pci-host", OBJECT(dev));
+ dev = qdev_new(OBJECT(machine), "pci-host", "e500-pcihost");
qdev_prop_set_uint32(dev, "first_slot", pmc->pci_first_slot);
qdev_prop_set_uint32(dev, "first_pin_irq", pci_irq_nrs[0]);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
for (i = 0; i < PCI_NUM_PINS; i++) {
sysbus_connect_irq(s, i, qdev_get_gpio_in(mpicdev, pci_irq_nrs[i]));
}
@@ -1076,14 +1075,15 @@ void ppce500_init(MachineState *machine)
}
/* Register spinning region */
- sysbus_create_simple_orphan("e500-spin", pmc->spin_base, NULL);
+ sysbus_create_simple(OBJECT(machine), "spin", "e500-spin",
+ pmc->spin_base, NULL);
if (pmc->has_mpc8xxx_gpio) {
qemu_irq poweroff_irq;
- dev = qdev_new_orphan("mpc8xxx_gpio");
+ dev = qdev_new(OBJECT(machine), "gpio", "mpc8xxx_gpio");
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(mpicdev, MPC8XXX_GPIO_IRQ));
memory_region_add_subregion(ccsr_addr_space, MPC8XXX_GPIO_OFFSET,
sysbus_mmio_get_region(s, 0));
@@ -1094,11 +1094,11 @@ void ppce500_init(MachineState *machine)
}
/* Platform Bus Device */
- dev = qdev_new_orphan(TYPE_PLATFORM_BUS_DEVICE);
+ dev = qdev_new(OBJECT(machine), "platform-bus", TYPE_PLATFORM_BUS_DEVICE);
dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE);
qdev_prop_set_uint32(dev, "num_irqs", pmc->platform_bus_num_irqs);
qdev_prop_set_uint32(dev, "mmio_size", pmc->platform_bus_size);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
pms->pbus_dev = PLATFORM_BUS_DEVICE(dev);
s = SYS_BUS_DEVICE(pms->pbus_dev);
@@ -1136,7 +1136,7 @@ void ppce500_init(MachineState *machine)
exit(1);
}
- dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
+ dev = qdev_new(OBJECT(machine), "flash", TYPE_PFLASH_CFI01);
qdev_prop_set_drive(dev, "drive", blk);
qdev_prop_set_uint32(dev, "num-blocks", size / sector_len);
qdev_prop_set_uint64(dev, "sector-length", sector_len);
@@ -1147,7 +1147,7 @@ void ppce500_init(MachineState *machine)
qdev_prop_set_uint16(dev, "id2", 0x0000);
qdev_prop_set_uint16(dev, "id3", 0x0);
qdev_prop_set_string(dev, "name", "e500.flash");
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
memory_region_add_subregion(&pms->pbus_dev->mmio, 0,
pflash_cfi01_get_memory(PFLASH_CFI01(dev)));
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index 8c46ecd6d1..e9ee44a2f1 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -159,7 +159,8 @@ static void ppc_core99_init(MachineState *machine)
/* init CPUs */
for (i = 0; i < machine->smp.cpus; i++) {
- cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = POWERPC_CPU(cpu_create(OBJECT(machine), "cpu[*]",
+ machine->cpu_type));
env = &cpu->env;
/* Set time-base frequency to 100 Mhz */
@@ -286,8 +287,8 @@ static void ppc_core99_init(MachineState *machine)
}
/* UniN init */
- s = SYS_BUS_DEVICE(qdev_new_orphan(TYPE_UNI_NORTH));
- sysbus_realize_and_unref(s, &error_fatal);
+ s = SYS_BUS_DEVICE(qdev_new(OBJECT(machine), "uni-n", TYPE_UNI_NORTH));
+ sysbus_realize(s, &error_fatal);
memory_region_add_subregion(get_system_memory(), 0xf8000000,
sysbus_mmio_get_region(s, 0));
@@ -295,9 +296,10 @@ static void ppc_core99_init(MachineState *machine)
machine_arch = ARCH_MAC99_U3;
/* 970 gets a U3 bus */
/* Uninorth AGP bus */
- uninorth_pci_dev = qdev_new_orphan(TYPE_U3_AGP_HOST_BRIDGE);
+ uninorth_pci_dev = qdev_new(OBJECT(machine), "u3-agp",
+ TYPE_U3_AGP_HOST_BRIDGE);
s = SYS_BUS_DEVICE(uninorth_pci_dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, 0xf0800000);
sysbus_mmio_map(s, 1, 0xf0c00000);
/* PCI hole */
@@ -310,25 +312,27 @@ static void ppc_core99_init(MachineState *machine)
machine_arch = ARCH_MAC99;
/* Use values found on a real PowerMac */
/* Uninorth AGP bus */
- uninorth_agp_dev = qdev_new_orphan(TYPE_UNI_NORTH_AGP_HOST_BRIDGE);
+ uninorth_agp_dev = qdev_new(OBJECT(machine), "uni-n-agp",
+ TYPE_UNI_NORTH_AGP_HOST_BRIDGE);
s = SYS_BUS_DEVICE(uninorth_agp_dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, 0xf0800000);
sysbus_mmio_map(s, 1, 0xf0c00000);
/* Uninorth internal bus */
- uninorth_internal_dev = qdev_new_orphan(
+ uninorth_internal_dev = qdev_new(OBJECT(machine), "uni-n-internal",
TYPE_UNI_NORTH_INTERNAL_PCI_HOST_BRIDGE);
s = SYS_BUS_DEVICE(uninorth_internal_dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, 0xf4800000);
sysbus_mmio_map(s, 1, 0xf4c00000);
/* Uninorth main bus - this must be last to make it the default */
- uninorth_pci_dev = qdev_new_orphan(TYPE_UNI_NORTH_PCI_HOST_BRIDGE);
+ uninorth_pci_dev = qdev_new(OBJECT(machine), "uni-n-pci",
+ TYPE_UNI_NORTH_PCI_HOST_BRIDGE);
qdev_prop_set_uint32(uninorth_pci_dev, "ofw-addr", 0xf2000000);
s = SYS_BUS_DEVICE(uninorth_pci_dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, 0xf2800000);
sysbus_mmio_map(s, 1, 0xf2c00000);
/* PCI hole */
@@ -348,7 +352,8 @@ static void ppc_core99_init(MachineState *machine)
pci_bus = PCI_HOST_BRIDGE(uninorth_pci_dev)->bus;
/* MacIO */
- macio = OBJECT(pci_new_orphan(-1, TYPE_NEWWORLD_MACIO));
+ macio = OBJECT(pci_new(OBJECT(machine), "macio", -1,
+ TYPE_NEWWORLD_MACIO));
dev = DEVICE(macio);
qdev_prop_set_uint64(dev, "frequency", tbfreq);
qdev_prop_set_bit(dev, "has-pmu", has_pmu);
@@ -358,7 +363,7 @@ static void ppc_core99_init(MachineState *machine)
qdev_prop_set_chr(dev, "chrA", serial_hd(0));
qdev_prop_set_chr(dev, "chrB", serial_hd(1));
- pci_realize_and_unref(PCI_DEVICE(macio), pci_bus, &error_fatal);
+ qdev_realize(DEVICE(macio), BUS(pci_bus), &error_fatal);
pic_dev = DEVICE(object_resolve_path_component(macio, "pic"));
for (i = 0; i < 4; i++) {
@@ -408,15 +413,15 @@ static void ppc_core99_init(MachineState *machine)
}
adb_bus = qdev_get_child_bus(dev, "adb.0");
- dev = qdev_new_orphan(TYPE_ADB_KEYBOARD);
- qdev_realize_and_unref(dev, adb_bus, &error_fatal);
+ dev = qdev_new(OBJECT(machine), "adb-keyboard", TYPE_ADB_KEYBOARD);
+ qdev_realize(dev, adb_bus, &error_fatal);
- dev = qdev_new_orphan(TYPE_ADB_MOUSE);
- qdev_realize_and_unref(dev, adb_bus, &error_fatal);
+ dev = qdev_new(OBJECT(machine), "adb-mouse", TYPE_ADB_MOUSE);
+ qdev_realize(dev, adb_bus, &error_fatal);
}
if (machine->usb) {
- pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
+ pci_create_simple(OBJECT(machine), "ohci", pci_bus, -1, "pci-ohci");
/* U3 needs to use USB for input because Linux doesn't support via-cuda
on PPC64 */
@@ -425,8 +430,8 @@ static void ppc_core99_init(MachineState *machine)
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
- usb_create_simple_orphan(usb_bus, "usb-kbd");
- usb_create_simple_orphan(usb_bus, "usb-mouse");
+ usb_create_simple(OBJECT(machine), "usb-kbd", usb_bus, "usb-kbd");
+ usb_create_simple(OBJECT(machine), "usb-mouse", usb_bus, "usb-mouse");
}
}
@@ -453,22 +458,21 @@ static void ppc_core99_init(MachineState *machine)
move the NVRAM out of ROM again for KVM */
nvram_addr = 0xFFE00000;
}
- dev = qdev_new_orphan(TYPE_MACIO_NVRAM);
+ dev = qdev_new(OBJECT(machine), "nvram", TYPE_MACIO_NVRAM);
qdev_prop_set_uint32(dev, "size", MACIO_NVRAM_SIZE);
qdev_prop_set_uint32(dev, "it_shift", 1);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, nvram_addr);
nvr = MACIO_NVRAM(dev);
pmac_format_nvram_partition(nvr, MACIO_NVRAM_SIZE);
/* No PCI init: the BIOS will do it */
- dev = qdev_new_orphan(TYPE_FW_CFG_MEM);
+ dev = qdev_new(OBJECT(machine), TYPE_FW_CFG, TYPE_FW_CFG_MEM);
fw_cfg = FW_CFG(dev);
qdev_prop_set_uint32(dev, "data_width", 1);
qdev_prop_set_bit(dev, "dma_enabled", false);
- object_property_add_child(OBJECT(machine), TYPE_FW_CFG, OBJECT(fw_cfg));
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, CFG_ADDR);
sysbus_mmio_map(s, 1, CFG_ADDR + 2);
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index 4c5746b754..6ef8207f96 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -111,7 +111,8 @@ static void ppc_heathrow_init(MachineState *machine)
/* init CPUs */
for (i = 0; i < machine->smp.cpus; i++) {
- cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = POWERPC_CPU(cpu_create(OBJECT(machine), "cpu[*]",
+ machine->cpu_type));
env = &cpu->env;
/* Set time-base frequency to 16.6 Mhz */
@@ -212,10 +213,11 @@ static void ppc_heathrow_init(MachineState *machine)
}
/* Grackle PCI host bridge */
- grackle_dev = qdev_new_orphan(TYPE_GRACKLE_PCI_HOST_BRIDGE);
+ grackle_dev = qdev_new(OBJECT(machine), "grackle",
+ TYPE_GRACKLE_PCI_HOST_BRIDGE);
qdev_prop_set_uint32(grackle_dev, "ofw-addr", 0x80000000);
s = SYS_BUS_DEVICE(grackle_dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, GRACKLE_BASE);
sysbus_mmio_map(s, 1, GRACKLE_BASE + 0x200000);
@@ -229,7 +231,8 @@ static void ppc_heathrow_init(MachineState *machine)
pci_bus = PCI_HOST_BRIDGE(grackle_dev)->bus;
/* MacIO */
- macio = OBJECT(pci_new_orphan(PCI_DEVFN(16, 0), TYPE_OLDWORLD_MACIO));
+ macio = OBJECT(pci_new(OBJECT(machine), "macio", PCI_DEVFN(16, 0),
+ TYPE_OLDWORLD_MACIO));
qdev_prop_set_uint64(DEVICE(macio), "frequency", tbfreq);
dev = DEVICE(object_resolve_path_component(macio, "escc"));
@@ -242,7 +245,7 @@ static void ppc_heathrow_init(MachineState *machine)
qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
}
- pci_realize_and_unref(PCI_DEVICE(macio), pci_bus, &error_fatal);
+ qdev_realize(DEVICE(macio), BUS(pci_bus), &error_fatal);
pic_dev = DEVICE(object_resolve_path_component(macio, "pic"));
for (i = 0; i < 4; i++) {
@@ -279,13 +282,13 @@ static void ppc_heathrow_init(MachineState *machine)
/* MacIO CUDA/ADB */
dev = DEVICE(object_resolve_path_component(macio, "cuda"));
adb_bus = qdev_get_child_bus(dev, "adb.0");
- dev = qdev_new_orphan(TYPE_ADB_KEYBOARD);
- qdev_realize_and_unref(dev, adb_bus, &error_fatal);
- dev = qdev_new_orphan(TYPE_ADB_MOUSE);
- qdev_realize_and_unref(dev, adb_bus, &error_fatal);
+ dev = qdev_new(OBJECT(machine), "adb-keyboard", TYPE_ADB_KEYBOARD);
+ qdev_realize(dev, adb_bus, &error_fatal);
+ dev = qdev_new(OBJECT(machine), "adb-mouse", TYPE_ADB_MOUSE);
+ qdev_realize(dev, adb_bus, &error_fatal);
if (machine_usb(machine)) {
- pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
+ pci_create_simple(OBJECT(machine), "ohci", pci_bus, -1, "pci-ohci");
}
if (!graphic_width) {
@@ -303,13 +306,12 @@ static void ppc_heathrow_init(MachineState *machine)
/* No PCI init: the BIOS will do it */
- dev = qdev_new_orphan(TYPE_FW_CFG_MEM);
+ dev = qdev_new(OBJECT(machine), TYPE_FW_CFG, TYPE_FW_CFG_MEM);
fw_cfg = FW_CFG(dev);
qdev_prop_set_uint32(dev, "data_width", 1);
qdev_prop_set_bit(dev, "dma_enabled", false);
- object_property_add_child(OBJECT(machine), TYPE_FW_CFG, OBJECT(fw_cfg));
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, CFG_ADDR);
sysbus_mmio_map(s, 1, CFG_ADDR + 2);
diff --git a/hw/ppc/pegasos.c b/hw/ppc/pegasos.c
index 2974625f1c..6ce1e3f174 100644
--- a/hw/ppc/pegasos.c
+++ b/hw/ppc/pegasos.c
@@ -163,7 +163,7 @@ static void pegasos_init(MachineState *machine)
uint8_t *spd_data;
/* init CPU */
- pm->cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
+ pm->cpu = POWERPC_CPU(cpu_create(OBJECT(machine), "cpu", machine->cpu_type));
env = &pm->cpu->env;
if (PPC_INPUT(env) != PPC_FLAGS_INPUT_6xx) {
error_report("Incompatible CPU, only 6xx bus supported");
@@ -218,7 +218,8 @@ static void pegasos_init(MachineState *machine)
MemoryRegion *pci_mem, *mr;
/* Articia S */
- pm->nb = DEVICE(sysbus_create_simple_orphan(TYPE_ARTICIA, 0xfe000000, NULL));
+ pm->nb = DEVICE(sysbus_create_simple(OBJECT(machine), "articia",
+ TYPE_ARTICIA, 0xfe000000, NULL));
pci_mem = sysbus_mmio_get_region(SYS_BUS_DEVICE(pm->nb), 1);
mr = g_new(MemoryRegion, 1);
memory_region_init_alias(mr, OBJECT(pm->nb), "pci-mem-low", pci_mem,
@@ -233,7 +234,8 @@ static void pegasos_init(MachineState *machine)
}
case PEGASOS2:
/* Marvell Discovery II system controller */
- pm->nb = DEVICE(sysbus_create_simple_orphan(TYPE_MV64361, -1,
+ pm->nb = DEVICE(sysbus_create_simple(OBJECT(machine), "mv64361",
+ TYPE_MV64361, -1,
qdev_get_gpio_in(DEVICE(pm->cpu), PPC6xx_INPUT_INT)));
pci_bus = mv64361_get_pci_bus(pm->nb, 1);
break;
@@ -241,7 +243,8 @@ static void pegasos_init(MachineState *machine)
/* VIA VT8231 South Bridge (multifunction PCI device) */
devfn = PCI_DEVFN(pm->type == PEGASOS1 ? 7 : 12, 0);
- pm->sb = DEVICE(pci_new_multifunction_orphan(devfn, TYPE_VT8231_ISA));
+ pm->sb = DEVICE(pci_new_multifunction(OBJECT(machine), "via", devfn,
+ TYPE_VT8231_ISA));
via = OBJECT(pm->sb);
/* Set properties on individual devices before realizing the south bridge */
@@ -250,7 +253,7 @@ static void pegasos_init(MachineState *machine)
qdev_prop_set_string(DEVICE(dev), "audiodev", machine->audiodev);
}
- pci_realize_and_unref(PCI_DEVICE(via), pci_bus, &error_abort);
+ qdev_realize(DEVICE(via), BUS(pci_bus), &error_abort);
object_property_add_alias(OBJECT(machine), "rtc-time",
object_resolve_path_component(via, "rtc"),
"date");
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 40a7559528..a53eab1d4f 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1008,13 +1008,14 @@ static bool pnv_match_cpu(const char *default_type, const char *cpu_type)
return ppc_default->pvr_match(ppc_default, ppc->pvr, false);
}
-static void pnv_ipmi_bt_init(ISABus *bus, IPMIBmc *bmc, uint32_t irq)
+static void pnv_ipmi_bt_init(Object *parent, ISABus *bus, IPMIBmc *bmc,
+ uint32_t irq)
{
- ISADevice *dev = isa_new_orphan("isa-ipmi-bt");
+ ISADevice *dev = isa_new(parent, "ipmi-bt", "isa-ipmi-bt");
object_property_set_link(OBJECT(dev), "bmc", OBJECT(bmc), &error_fatal);
object_property_set_int(OBJECT(dev), "irq", irq, &error_fatal);
- isa_realize_and_unref(dev, bus, &error_fatal);
+ qdev_realize(DEVICE(dev), BUS(bus), &error_fatal);
}
static void pnv_chip_power10_pic_print_info(PnvChip *chip, GString *buf)
@@ -1127,7 +1128,7 @@ static void pnv_init(MachineState *machine)
/*
* Create our simple PNOR device
*/
- dev = qdev_new_orphan(TYPE_PNV_PNOR);
+ dev = qdev_new(OBJECT(machine), "pnor", TYPE_PNV_PNOR);
pnor = drive_get(IF_MTD, 0, 0);
if (!pnor && defaults_enabled()) {
fw_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, PNOR_FILE_NAME);
@@ -1143,7 +1144,7 @@ static void pnv_init(MachineState *machine)
if (pnor) {
qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(pnor));
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
pnv->pnor = PNV_PNOR(dev);
/* load skiboot firmware */
@@ -1269,9 +1270,11 @@ static void pnv_init(MachineState *machine)
pnv->chips = g_new0(PnvChip *, pnv->num_chips);
for (i = 0; i < pnv->num_chips; i++) {
char chip_name[32];
- Object *chip = OBJECT(qdev_new_orphan(chip_typename));
+ Object *chip;
uint64_t chip_ram_size = pnv_chip_get_ram_size(pnv, i);
+ snprintf(chip_name, sizeof(chip_name), "chip[%d]", i);
+ chip = OBJECT(qdev_new(OBJECT(pnv), chip_name, chip_typename));
pnv->chips[i] = PNV_CHIP(chip);
/* Distribute RAM among the chips */
@@ -1281,8 +1284,6 @@ static void pnv_init(MachineState *machine)
&error_fatal);
chip_ram_start += chip_ram_size;
- snprintf(chip_name, sizeof(chip_name), "chip[%d]", i);
- object_property_add_child(OBJECT(pnv), chip_name, chip);
object_property_set_int(chip, "chip-id", i, &error_fatal);
object_property_set_int(chip, "nr-cores", machine->smp.cores,
&error_fatal);
@@ -1303,7 +1304,7 @@ static void pnv_init(MachineState *machine)
object_property_set_link(chip, "xive-fabric", OBJECT(pnv),
&error_abort);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(chip), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(chip), &error_fatal);
}
g_free(chip_typename);
@@ -1321,8 +1322,8 @@ static void pnv_init(MachineState *machine)
* communication with the BMC
*/
if (defaults_enabled()) {
- pnv->bmc = pnv_bmc_create(pnv->pnor);
- pnv_ipmi_bt_init(pnv->isa_bus, pnv->bmc, 10);
+ pnv->bmc = pnv_bmc_create(OBJECT(machine), pnv->pnor);
+ pnv_ipmi_bt_init(OBJECT(machine), pnv->isa_bus, pnv->bmc, 10);
}
/*
@@ -2825,7 +2826,8 @@ static void pnv_rainier_i2c_init(PnvMachineState *pnv)
* Add a PCA9552 I2C device for PCIe hotplug control
* to engine 2, bus 1, address 0x63
*/
- I2CSlave *dev = i2c_slave_create_simple_orphan(chip10->i2c[2].busses[1],
+ I2CSlave *dev = i2c_slave_create_simple(OBJECT(pnv), "pca9552[*]",
+ chip10->i2c[2].busses[1],
"pca9552", 0x63);
/*
@@ -2843,7 +2845,8 @@ static void pnv_rainier_i2c_init(PnvMachineState *pnv)
* Add a PCA9554 I2C device for cable card presence detection
* to engine 2, bus 1, address 0x25
*/
- i2c_slave_create_simple_orphan(chip10->i2c[2].busses[1], "pca9554", 0x25);
+ i2c_slave_create_simple(OBJECT(pnv), "pca9554[*]",
+ chip10->i2c[2].busses[1], "pca9554", 0x25);
}
}
diff --git a/hw/ppc/pnv_bmc.c b/hw/ppc/pnv_bmc.c
index 6f65984f2e..dd4fd20f21 100644
--- a/hw/ppc/pnv_bmc.c
+++ b/hw/ppc/pnv_bmc.c
@@ -295,11 +295,11 @@ void pnv_bmc_set_pnor(IPMIBmc *bmc, PnvPnor *pnor)
* Instantiate the machine BMC. PowerNV uses the QEMU internal
* simulator but it could also be external.
*/
-IPMIBmc *pnv_bmc_create(PnvPnor *pnor)
+IPMIBmc *pnv_bmc_create(Object *parent, PnvPnor *pnor)
{
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_IPMI_BMC_SIMULATOR);
+ dev = qdev_new(parent, "bmc", TYPE_IPMI_BMC_SIMULATOR);
qdev_realize(dev, NULL, &error_fatal);
pnv_bmc_set_pnor(IPMI_BMC(dev), pnor);
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 499949bfdf..2d9efeba77 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -148,7 +148,7 @@ static void bamboo_init(MachineState *machine)
exit(EXIT_FAILURE);
}
- cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = POWERPC_CPU(cpu_create(OBJECT(machine), "cpu", machine->cpu_type));
env = &cpu->env;
if (env->mmu_model != POWERPC_MMU_BOOKE) {
@@ -162,9 +162,8 @@ static void bamboo_init(MachineState *machine)
ppc_dcr_init(env, NULL, NULL);
/* interrupt controller */
- uicdev = qdev_new_orphan(TYPE_PPC_UIC);
+ uicdev = qdev_new(OBJECT(machine), "uic", TYPE_PPC_UIC);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(uicdev), cpu, &error_fatal);
- object_unref(OBJECT(uicdev));
uicsbd = SYS_BUS_DEVICE(uicdev);
sysbus_connect_irq(uicsbd, PPCUIC_OUTPUT_INT,
qdev_get_gpio_in(DEVICE(cpu), PPC40x_INPUT_INT));
@@ -172,18 +171,18 @@ static void bamboo_init(MachineState *machine)
qdev_get_gpio_in(DEVICE(cpu), PPC40x_INPUT_CINT));
/* SDRAM controller */
- dev = qdev_new_orphan(TYPE_PPC4xx_SDRAM_DDR);
+ dev = qdev_new(OBJECT(machine), "sdram", TYPE_PPC4xx_SDRAM_DDR);
object_property_set_link(OBJECT(dev), "dram", OBJECT(machine->ram),
&error_abort);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(dev), cpu, &error_fatal);
- object_unref(OBJECT(dev));
/* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, qdev_get_gpio_in(uicdev, 14));
/* Enable SDRAM memory regions, this should be done by the firmware */
ppc4xx_sdram_ddr_enable(PPC4xx_SDRAM_DDR(dev));
/* PCI */
- dev = sysbus_create_varargs_orphan(TYPE_PPC4xx_PCI_HOST, PPC440EP_PCI_CONFIG,
+ dev = sysbus_create_varargs(OBJECT(machine), "pci-host",
+ TYPE_PPC4xx_PCI_HOST, PPC440EP_PCI_CONFIG,
qdev_get_gpio_in(uicdev, pci_irq_nrs[0]),
qdev_get_gpio_in(uicdev, pci_irq_nrs[1]),
qdev_get_gpio_in(uicdev, pci_irq_nrs[2]),
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index c861e022f0..ff85a4e64b 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -257,7 +257,7 @@ static void ibm_40p_init(MachineState *machine)
}
/* init CPU */
- cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = POWERPC_CPU(cpu_create(OBJECT(machine), "cpu", machine->cpu_type));
env = &cpu->env;
if (PPC_INPUT(env) != PPC_FLAGS_INPUT_6xx) {
error_report("only 6xx bus is supported on this machine");
@@ -289,10 +289,9 @@ static void ibm_40p_init(MachineState *machine)
g_free(filename);
/* PCI host */
- dev = qdev_new_orphan("raven-pcihost");
+ dev = qdev_new(OBJECT(machine), "raven", "raven-pcihost");
pcihost = SYS_BUS_DEVICE(dev);
- object_property_add_child(qdev_get_machine(), "raven", OBJECT(dev));
- sysbus_realize_and_unref(pcihost, &error_fatal);
+ sysbus_realize(pcihost, &error_fatal);
pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci.0"));
if (!pci_bus) {
error_report("could not create PCI host controller");
@@ -300,8 +299,9 @@ static void ibm_40p_init(MachineState *machine)
}
/* PCI -> ISA bridge */
- i82378_dev = DEVICE(pci_new_orphan(PCI_DEVFN(11, 0), "i82378"));
- qdev_realize_and_unref(i82378_dev, BUS(pci_bus), &error_fatal);
+ i82378_dev = DEVICE(pci_new(OBJECT(machine), "i82378",
+ PCI_DEVFN(11, 0), "i82378"));
+ qdev_realize(i82378_dev, BUS(pci_bus), &error_fatal);
qdev_connect_gpio_out(i82378_dev, 0,
qdev_get_gpio_in(DEVICE(cpu), PPC6xx_INPUT_INT));
@@ -309,23 +309,23 @@ static void ibm_40p_init(MachineState *machine)
isa_bus = ISA_BUS(qdev_get_child_bus(i82378_dev, "isa.0"));
/* system control ports */
- isa_dev = isa_new_orphan("prep-systemio");
+ isa_dev = isa_new(OBJECT(machine), "systemio", "prep-systemio");
dev = DEVICE(isa_dev);
qdev_prop_set_uint32(dev, "ibm-planar-id", 0xfc);
qdev_prop_set_uint32(dev, "equipment", 0xc0);
- isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
+ qdev_realize(DEVICE(isa_dev), BUS(isa_bus), &error_fatal);
/* Memory controller */
- isa_dev = isa_new_orphan("rs6000-mc");
+ isa_dev = isa_new(OBJECT(machine), "mc", "rs6000-mc");
dev = DEVICE(isa_dev);
qdev_prop_set_uint32(dev, "ram-size", machine->ram_size);
- isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
+ qdev_realize(DEVICE(isa_dev), BUS(isa_bus), &error_fatal);
/* RTC */
- isa_dev = isa_new_orphan(TYPE_MC146818_RTC);
+ isa_dev = isa_new(OBJECT(machine), "rtc", TYPE_MC146818_RTC);
dev = DEVICE(isa_dev);
qdev_prop_set_int32(dev, "base_year", 1900);
- isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
+ qdev_realize(DEVICE(isa_dev), BUS(isa_bus), &error_fatal);
/* initialize CMOS checksums */
cmos_checksum = 0x6aa9;
@@ -334,23 +334,25 @@ static void ibm_40p_init(MachineState *machine)
/* add some more devices */
if (defaults_enabled()) {
- m48t59 = NVRAM(isa_create_simple_orphan(isa_bus, "isa-m48t59"));
+ m48t59 = NVRAM(isa_create_simple(OBJECT(machine), "m48t59",
+ isa_bus, "isa-m48t59"));
- isa_dev = isa_new_orphan("cs4231a");
+ isa_dev = isa_new(OBJECT(machine), "cs4231a", "cs4231a");
dev = DEVICE(isa_dev);
qdev_prop_set_uint32(dev, "iobase", 0x830);
qdev_prop_set_uint32(dev, "irq", 10);
if (machine->audiodev) {
qdev_prop_set_string(dev, "audiodev", machine->audiodev);
}
- isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
+ qdev_realize(DEVICE(isa_dev), BUS(isa_bus), &error_fatal);
- isa_dev = isa_new_orphan("pc87312");
+ isa_dev = isa_new(OBJECT(machine), "pc87312", "pc87312");
dev = DEVICE(isa_dev);
qdev_prop_set_uint32(dev, "config", 12);
- isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
+ qdev_realize(DEVICE(isa_dev), BUS(isa_bus), &error_fatal);
- dev = DEVICE(pci_create_simple_orphan(pci_bus, PCI_DEVFN(1, 0), "lsi53c810"));
+ dev = DEVICE(pci_create_simple(OBJECT(machine), "scsi", pci_bus,
+ PCI_DEVFN(1, 0), "lsi53c810"));
lsi53c8xx_handle_legacy_cmdline(dev);
qdev_connect_gpio_out(dev, 0, qdev_get_gpio_in(i82378_dev, 13));
@@ -363,14 +365,12 @@ static void ibm_40p_init(MachineState *machine)
}
/* Prepare firmware configuration for OpenBIOS */
- dev = qdev_new_orphan(TYPE_FW_CFG_MEM);
+ dev = qdev_new(OBJECT(machine), TYPE_FW_CFG, TYPE_FW_CFG_MEM);
fw_cfg = FW_CFG(dev);
qdev_prop_set_uint32(dev, "data_width", 1);
qdev_prop_set_bit(dev, "dma_enabled", false);
- object_property_add_child(OBJECT(qdev_get_machine()), TYPE_FW_CFG,
- OBJECT(fw_cfg));
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, CFG_ADDR);
sysbus_mmio_map(s, 1, CFG_ADDR + 2);
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index be506b02f2..59c217e2b2 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -261,7 +261,7 @@ static void sam460ex_init(MachineState *machine)
uint8_t *spd_data;
int success;
- cpu = POWERPC_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = POWERPC_CPU(cpu_create(OBJECT(machine), "cpu", machine->cpu_type));
env = &cpu->env;
if (env->mmu_model != POWERPC_MMU_BOOKE) {
error_report("Only MMU model BookE is supported by this machine.");
@@ -276,9 +276,8 @@ static void sam460ex_init(MachineState *machine)
ppc_dcr_init(env, NULL, NULL);
/* PLB arbitrer */
- dev = qdev_new_orphan(TYPE_PPC4xx_PLB);
+ dev = qdev_new(OBJECT(machine), "plb", TYPE_PPC4xx_PLB);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(dev), cpu, &error_fatal);
- object_unref(OBJECT(dev));
/* interrupt controllers */
for (i = 0; i < ARRAY_SIZE(uic); i++) {
@@ -292,10 +291,9 @@ static void sam460ex_init(MachineState *machine)
*/
const int input_ints[] = { -1, 30, 10, 16 };
- uic[i] = qdev_new_orphan(TYPE_PPC_UIC);
+ uic[i] = qdev_new(OBJECT(machine), "uic[*]", TYPE_PPC_UIC);
qdev_prop_set_uint32(uic[i], "dcr-base", 0xc0 + i * 0x10);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(uic[i]), cpu, &error_fatal);
- object_unref(OBJECT(uic[i]));
sbdev = SYS_BUS_DEVICE(uic[i]);
if (i == 0) {
@@ -322,7 +320,7 @@ static void sam460ex_init(MachineState *machine)
error_report("Memory below 64 MiB is not supported");
exit(1);
}
- dev = qdev_new_orphan(TYPE_PPC4xx_SDRAM_DDR2);
+ dev = qdev_new(OBJECT(machine), "sdram", TYPE_PPC4xx_SDRAM_DDR2);
object_property_set_link(OBJECT(dev), "dram", OBJECT(machine->ram),
&error_abort);
/*
@@ -331,14 +329,13 @@ static void sam460ex_init(MachineState *machine)
*/
object_property_set_int(OBJECT(dev), "nbanks", 1, &error_abort);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(dev), cpu, &error_fatal);
- object_unref(OBJECT(dev));
/* FIXME: does 460EX have ECC interrupts? */
/* Enable SDRAM memory regions as we may boot without firmware */
ppc4xx_sdram_ddr2_enable(PPC4xx_SDRAM_DDR2(dev));
/* IIC controllers and devices */
- dev = sysbus_create_simple_orphan(TYPE_PPC4xx_I2C, 0x4ef600700,
- qdev_get_gpio_in(uic[0], 2));
+ dev = sysbus_create_simple(OBJECT(machine), "i2c[*]", TYPE_PPC4xx_I2C,
+ 0x4ef600700, qdev_get_gpio_in(uic[0], 2));
i2c = PPC4xx_I2C(dev)->bus;
/* SPD EEPROM on RAM module */
spd_data = spd_data_generate(machine->ram_size < 128 * MiB ? DDR : DDR2,
@@ -346,15 +343,14 @@ static void sam460ex_init(MachineState *machine)
spd_data[20] = 4; /* SO-DIMM module */
smbus_eeprom_init_one(OBJECT(machine), i2c, 0x50, spd_data);
/* RTC */
- i2c_slave_create_simple_orphan(i2c, "m41t80", 0x68);
+ i2c_slave_create_simple(OBJECT(machine), "rtc", i2c, "m41t80", 0x68);
- dev = sysbus_create_simple_orphan(TYPE_PPC4xx_I2C, 0x4ef600800,
- qdev_get_gpio_in(uic[0], 3));
+ dev = sysbus_create_simple(OBJECT(machine), "i2c[*]", TYPE_PPC4xx_I2C,
+ 0x4ef600800, qdev_get_gpio_in(uic[0], 3));
/* External bus controller */
- dev = qdev_new_orphan(TYPE_PPC4xx_EBC);
+ dev = qdev_new(OBJECT(machine), "ebc", TYPE_PPC4xx_EBC);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(dev), cpu, &error_fatal);
- object_unref(OBJECT(dev));
/* CPR */
ppc4xx_cpr_init(env);
@@ -366,11 +362,10 @@ static void sam460ex_init(MachineState *machine)
ppc4xx_sdr_init(env);
/* MAL */
- dev = qdev_new_orphan(TYPE_PPC4xx_MAL);
+ dev = qdev_new(OBJECT(machine), "mal", TYPE_PPC4xx_MAL);
qdev_prop_set_uint8(dev, "txc-num", 4);
qdev_prop_set_uint8(dev, "rxc-num", 16);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(dev), cpu, &error_fatal);
- object_unref(OBJECT(dev));
sbdev = SYS_BUS_DEVICE(dev);
for (i = 0; i < ARRAY_SIZE(PPC4xx_MAL(dev)->irqs); i++) {
sysbus_connect_irq(sbdev, i, qdev_get_gpio_in(uic[2], 3 + i));
@@ -388,49 +383,51 @@ static void sam460ex_init(MachineState *machine)
l2cache_ram);
/* USB */
- sysbus_create_simple_orphan(TYPE_PPC4xx_EHCI, 0x4bffd0400,
- qdev_get_gpio_in(uic[2], 29));
- dev = qdev_new_orphan("sysbus-ohci");
+ sysbus_create_simple(OBJECT(machine), "ehci", TYPE_PPC4xx_EHCI,
+ 0x4bffd0400, qdev_get_gpio_in(uic[2], 29));
+ dev = qdev_new(OBJECT(machine), "ohci", "sysbus-ohci");
qdev_prop_set_string(dev, "masterbus", "usb-bus.0");
qdev_prop_set_uint32(dev, "num-ports", 6);
sbdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sbdev, &error_fatal);
+ sysbus_realize(sbdev, &error_fatal);
sysbus_mmio_map(sbdev, 0, 0x4bffd0000);
sysbus_connect_irq(sbdev, 0, qdev_get_gpio_in(uic[2], 30));
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
- usb_create_simple_orphan(usb_bus, "usb-kbd");
- usb_create_simple_orphan(usb_bus, "usb-mouse");
+ usb_create_simple(OBJECT(machine), "usb-kbd", usb_bus, "usb-kbd");
+ usb_create_simple(OBJECT(machine), "usb-mouse", usb_bus, "usb-mouse");
/* PCIe buses */
- dev = qdev_new_orphan(TYPE_PPC460EX_PCIE_HOST);
+ dev = qdev_new(OBJECT(machine), "pcie-host[*]", TYPE_PPC460EX_PCIE_HOST);
qdev_prop_set_int32(dev, "busnum", 0);
qdev_prop_set_int32(dev, "dcrn-base", PCIE0_DCRN_BASE);
object_property_set_link(OBJECT(dev), "cpu", OBJECT(cpu), &error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
- dev = qdev_new_orphan(TYPE_PPC460EX_PCIE_HOST);
+ dev = qdev_new(OBJECT(machine), "pcie-host[*]", TYPE_PPC460EX_PCIE_HOST);
qdev_prop_set_int32(dev, "busnum", 1);
qdev_prop_set_int32(dev, "dcrn-base", PCIE1_DCRN_BASE);
object_property_set_link(OBJECT(dev), "cpu", OBJECT(cpu), &error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
/* PCI bus */
/* All PCI irqs are connected to the same UIC pin (cf. UBoot source) */
- dev = sysbus_create_simple_orphan(TYPE_PPC440_PCIX_HOST, 0xc0ec00000,
+ dev = sysbus_create_simple(OBJECT(machine), "pcix-host",
+ TYPE_PPC440_PCIX_HOST, 0xc0ec00000,
qdev_get_gpio_in(uic[1], 0));
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 1, 0xc08000000);
pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci.0"));
/* PCI devices */
- pci_create_simple_orphan(pci_bus, PCI_DEVFN(6, 0), "sm501");
+ pci_create_simple(OBJECT(machine), "sm501", pci_bus, PCI_DEVFN(6, 0), "sm501");
/*
* SoC has a single SATA port but we don't emulate that
* However, firmware and usual clients have driver for SiI311x
* PCI SATA card so add one for convenience by default
*/
if (defaults_enabled()) {
- PCIIDEState *s = PCI_IDE(pci_create_simple_orphan(pci_bus, -1, "sii3112"));
+ PCIIDEState *s = PCI_IDE(pci_create_simple(OBJECT(machine), "sata",
+ pci_bus, -1, "sii3112"));
DriveInfo *di;
di = drive_get_by_index(IF_IDE, 0);
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 969f821aca..fbf6c59516 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1885,7 +1885,7 @@ static void spapr_machine_reset(MachineState *machine, ResetType type)
static void spapr_create_nvram(SpaprMachineState *spapr)
{
- DeviceState *dev = qdev_new_orphan("spapr-nvram");
+ DeviceState *dev = qdev_new(OBJECT(spapr), "nvram", "spapr-nvram");
DriveInfo *dinfo = drive_get(IF_PFLASH, 0, 0);
if (dinfo) {
@@ -1893,7 +1893,7 @@ static void spapr_create_nvram(SpaprMachineState *spapr)
&error_fatal);
}
- qdev_realize_and_unref(dev, &spapr->vio_bus->bus, &error_fatal);
+ qdev_realize(dev, &spapr->vio_bus->bus, &error_fatal);
spapr->nvram = (struct SpaprNvram *)dev;
}
@@ -2795,13 +2795,13 @@ static void spapr_init_cpus(SpaprMachineState *spapr)
}
}
-static PCIHostState *spapr_create_default_phb(void)
+static PCIHostState *spapr_create_default_phb(Object *parent)
{
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_SPAPR_PCI_HOST_BRIDGE);
+ dev = qdev_new(parent, "phb[*]", TYPE_SPAPR_PCI_HOST_BRIDGE);
qdev_prop_set_uint32(dev, "index", 0);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
return PCI_HOST_BRIDGE(dev);
}
@@ -3030,7 +3030,7 @@ static void spapr_machine_init(MachineState *machine)
spapr_rtc_create(spapr);
/* Set up VIO bus */
- spapr->vio_bus = spapr_vio_bus_init();
+ spapr->vio_bus = spapr_vio_bus_init(OBJECT(machine));
for (i = 0; serial_hd(i); i++) {
spapr_vty_create(OBJECT(machine), spapr->vio_bus, serial_hd(i));
@@ -3053,7 +3053,7 @@ static void spapr_machine_init(MachineState *machine)
/* Set up PCI */
spapr_pci_rtas_init();
- phb = spapr_create_default_phb();
+ phb = spapr_create_default_phb(OBJECT(machine));
while ((nd = qemu_find_nic_info("spapr-vlan", true, "ibmveth"))) {
spapr_vlan_create(OBJECT(spapr), spapr->vio_bus, nd);
@@ -3075,15 +3075,16 @@ static void spapr_machine_init(MachineState *machine)
}
if (machine->usb) {
- pci_create_simple_orphan(phb->bus, -1, "nec-usb-xhci");
+ pci_create_simple(OBJECT(machine), "xhci", phb->bus, -1,
+ "nec-usb-xhci");
if (has_vga) {
USBBus *usb_bus;
usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
&error_abort));
- usb_create_simple_orphan(usb_bus, "usb-kbd");
- usb_create_simple_orphan(usb_bus, "usb-mouse");
+ usb_create_simple(OBJECT(machine), "usb-kbd", usb_bus, "usb-kbd");
+ usb_create_simple(OBJECT(machine), "usb-mouse", usb_bus, "usb-mouse");
}
}
diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
index 76ae80d16e..b9e5f5d710 100644
--- a/hw/ppc/spapr_irq.c
+++ b/hw/ppc/spapr_irq.c
@@ -312,7 +312,7 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
DeviceState *dev;
int i;
- dev = qdev_new_orphan(TYPE_SPAPR_XIVE);
+ dev = qdev_new(OBJECT(spapr), "xive", TYPE_SPAPR_XIVE);
qdev_prop_set_uint32(dev, "nr-irqs", SPAPR_NR_XIRQS + SPAPR_IRQ_NR_IPIS);
/*
* 8 XIVE END structures per CPU. One for each available
@@ -321,7 +321,7 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
qdev_prop_set_uint32(dev, "nr-ends", nr_servers << 3);
object_property_set_link(OBJECT(dev), "xive-fabric", OBJECT(spapr),
&error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
spapr->xive = SPAPR_XIVE(dev);
diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c
index 0f22fa61a4..1e9cbf99ea 100644
--- a/hw/ppc/spapr_vio.c
+++ b/hw/ppc/spapr_vio.c
@@ -557,21 +557,21 @@ static target_ulong h_vio_signal(PowerPCCPU *cpu, SpaprMachineState *spapr,
return H_SUCCESS;
}
-SpaprVioBus *spapr_vio_bus_init(void)
+SpaprVioBus *spapr_vio_bus_init(Object *parent)
{
SpaprVioBus *bus;
BusState *qbus;
DeviceState *dev;
/* Create bridge device */
- dev = qdev_new_orphan(TYPE_SPAPR_VIO_BRIDGE);
+ dev = qdev_new(parent, "vio-bridge", TYPE_SPAPR_VIO_BRIDGE);
/* Create bus on bridge device */
qbus = qbus_new(TYPE_SPAPR_VIO_BUS, dev, "spapr-vio");
bus = SPAPR_VIO_BUS(qbus);
bus->next_reg = SPAPR_VIO_REG_BASE;
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
/* hcall-vio */
spapr_register_hypercall(H_VIO_SIGNAL, h_vio_signal);
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index 8f4b8965a9..d268ce4987 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -69,14 +69,15 @@ static struct boot_info
void *vfdt;
} boot_info;
-static PowerPCCPU *ppc440_init_xilinx(const char *cpu_type, uint32_t sysclk)
+static PowerPCCPU *ppc440_init_xilinx(Object *parent, const char *cpu_type,
+ uint32_t sysclk)
{
PowerPCCPU *cpu;
CPUPPCState *env;
DeviceState *uicdev;
SysBusDevice *uicsbd;
- cpu = POWERPC_CPU(cpu_create_orphan(cpu_type));
+ cpu = POWERPC_CPU(cpu_create(parent, "cpu", cpu_type));
env = &cpu->env;
ppc_booke_timers_init(cpu, sysclk, 0/* no flags */);
@@ -84,9 +85,8 @@ static PowerPCCPU *ppc440_init_xilinx(const char *cpu_type, uint32_t sysclk)
ppc_dcr_init(env, NULL, NULL);
/* interrupt controller */
- uicdev = qdev_new_orphan(TYPE_PPC_UIC);
+ uicdev = qdev_new(parent, "uic", TYPE_PPC_UIC);
ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(uicdev), cpu, &error_fatal);
- object_unref(OBJECT(uicdev));
uicsbd = SYS_BUS_DEVICE(uicdev);
sysbus_connect_irq(uicsbd, PPCUIC_OUTPUT_INT,
qdev_get_gpio_in(DEVICE(cpu), PPC40x_INPUT_INT));
@@ -199,7 +199,7 @@ static void virtex_init(MachineState *machine)
int i;
/* init CPUs */
- cpu = ppc440_init_xilinx(machine->cpu_type, 400000000);
+ cpu = ppc440_init_xilinx(OBJECT(machine), machine->cpu_type, 400000000);
env = &cpu->env;
if (env->mmu_model != POWERPC_MMU_BOOKE) {
@@ -218,10 +218,10 @@ static void virtex_init(MachineState *machine)
64 * KiB, 1, 0x89, 0x18, 0x0000, 0x0, 1);
cpu_irq = qdev_get_gpio_in(DEVICE(cpu), PPC40x_INPUT_INT);
- dev = qdev_new_orphan("xlnx.xps-intc");
+ dev = qdev_new(OBJECT(machine), "intc", "xlnx.xps-intc");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_BIG);
qdev_prop_set_uint32(dev, "kind-of-intr", 0);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, INTC_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, cpu_irq);
for (i = 0; i < 32; i++) {
@@ -233,11 +233,11 @@ static void virtex_init(MachineState *machine)
115200, serial_hd(0), DEVICE_LITTLE_ENDIAN);
/* 2 timers at irq 2 @ 62 Mhz. */
- dev = qdev_new_orphan("xlnx.xps-timer");
+ dev = qdev_new(OBJECT(machine), "timer", "xlnx.xps-timer");
qdev_prop_set_enum(dev, "endianness", ENDIAN_MODE_BIG);
qdev_prop_set_uint32(dev, "one-timer-only", 0);
qdev_prop_set_uint32(dev, "clock-frequency", 62 * 1000000);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, TIMER_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[TIMER_IRQ]);
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 60e902d9c5..6bf8d57972 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -122,7 +122,7 @@ void pnv_cpu_do_nmi_resume(CPUState *cs);
*/
void pnv_dt_bmc_sensors(IPMIBmc *bmc, void *fdt);
void pnv_bmc_powerdown(IPMIBmc *bmc);
-IPMIBmc *pnv_bmc_create(PnvPnor *pnor);
+IPMIBmc *pnv_bmc_create(Object *parent, PnvPnor *pnor);
IPMIBmc *pnv_bmc_find(Error **errp);
void pnv_bmc_set_pnor(IPMIBmc *bmc, PnvPnor *pnor);
diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h
index 3ca0c9d261..b834a963da 100644
--- a/include/hw/ppc/spapr_vio.h
+++ b/include/hw/ppc/spapr_vio.h
@@ -76,7 +76,7 @@ struct SpaprVioBus {
uint32_t next_reg;
};
-SpaprVioBus *spapr_vio_bus_init(void);
+SpaprVioBus *spapr_vio_bus_init(Object *parent);
SpaprVioDevice *spapr_vio_find_by_reg(SpaprVioBus *bus, uint32_t reg);
void spapr_dt_vdevice(SpaprVioBus *bus, void *fdt);
gchar *spapr_vio_stdout_path(SpaprVioBus *bus);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 055/134] hw/pci, hw/isa: Give VGA and slot-NIC helpers a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (53 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 054/134] hw/ppc: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 056/134] hw/arm/virt: Give onboard devices " Alexander Graf
` (79 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Now that all callers of pci_vga_init(), pci_init_nic_in_slot() and
isa_vga_init() live in already-converted board files, thread an
Object *parent through these three convenience helpers so that the
default VGA and default NIC created via -vga and -net become proper
children of their machine instead of landing under
/machine/unattached.
pc_vga_init() and the two static network_init() helpers in
hw/mips/{fuloong2e,malta}.c gain the parent argument as well and
pass it through.
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/alpha/dp264.c | 2 +-
hw/i386/isapc.c | 2 +-
hw/i386/pc.c | 6 +++---
hw/i386/pc_piix.c | 2 +-
hw/i386/pc_q35.c | 2 +-
hw/isa/isa-bus.c | 6 +++---
hw/mips/fuloong2e.c | 6 +++---
hw/mips/loongson3_virt.c | 2 +-
hw/mips/malta.c | 8 ++++----
hw/pci/pci.c | 18 +++++++++---------
hw/ppc/amigaone.c | 2 +-
hw/ppc/mac_newworld.c | 2 +-
hw/ppc/mac_oldworld.c | 2 +-
hw/ppc/pegasos.c | 2 +-
hw/ppc/prep.c | 4 ++--
hw/ppc/spapr.c | 6 +++---
hw/riscv/boston-aia.c | 3 ++-
hw/sh4/r2d.c | 2 +-
include/hw/i386/pc.h | 2 +-
include/hw/isa/isa.h | 2 +-
include/hw/pci/pci.h | 4 ++--
21 files changed, 43 insertions(+), 42 deletions(-)
diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index 40dee88f2d..d7d4fe3e8b 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -122,7 +122,7 @@ static void clipper_init(MachineState *machine)
mc146818_rtc_init(mo, isa_bus, 1900, rtc_irq);
/* VGA setup. Don't bother loading the bios. */
- pci_vga_init(pci_bus);
+ pci_vga_init(OBJECT(machine), pci_bus);
/* Network setup. e1000 is good enough, failing Tulip support. */
pci_init_nic_devices(pci_bus, mc->default_nic);
diff --git a/hw/i386/isapc.c b/hw/i386/isapc.c
index c5bba66967..842ae94acb 100644
--- a/hw/i386/isapc.c
+++ b/hw/i386/isapc.c
@@ -130,7 +130,7 @@ static void pc_init_isa(MachineState *machine)
x86_register_ferr_irq(x86ms->gsi[13]);
}
- pc_vga_init(isa_bus, NULL);
+ pc_vga_init(OBJECT(machine), isa_bus, NULL);
/* init basic PC hardware */
pc_basic_device_init(pcms, isa_bus, x86ms->gsi, x86ms->rtc,
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 1073888b42..0c89310ab7 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -946,15 +946,15 @@ uint64_t pc_pci_hole64_start(void)
return ROUND_UP(hole64_start, 1 * GiB);
}
-DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus)
+DeviceState *pc_vga_init(Object *parent, ISABus *isa_bus, PCIBus *pci_bus)
{
DeviceState *dev = NULL;
if (pci_bus) {
- PCIDevice *pcidev = pci_vga_init(pci_bus);
+ PCIDevice *pcidev = pci_vga_init(parent, pci_bus);
dev = pcidev ? &pcidev->qdev : NULL;
} else if (isa_bus) {
- ISADevice *isadev = isa_vga_init(isa_bus);
+ ISADevice *isadev = isa_vga_init(parent, isa_bus);
dev = isadev ? DEVICE(isadev) : NULL;
}
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 8ae2108e73..c9e6c61734 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -290,7 +290,7 @@ static void pc_init1(MachineState *machine, const char *pci_type)
x86_register_ferr_irq(x86ms->gsi[13]);
}
- pc_vga_init(isa_bus, pcms->pcibus);
+ pc_vga_init(OBJECT(machine), isa_bus, pcms->pcibus);
/* init basic PC hardware */
pc_basic_device_init(pcms, isa_bus, x86ms->gsi, x86ms->rtc,
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 1a65811fae..62625abed8 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -325,7 +325,7 @@ static void pc_q35_init(MachineState *machine)
}
/* the rest devices to which pci devfn is automatically assigned */
- pc_vga_init(isa_bus, pcms->pcibus);
+ pc_vga_init(OBJECT(machine), isa_bus, pcms->pcibus);
pc_nic_init(pcmc, isa_bus, pcms->pcibus);
if (machine->nvdimms_state->is_enabled) {
diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c
index c15cf53469..fb20c43869 100644
--- a/hw/isa/isa-bus.c
+++ b/hw/isa/isa-bus.c
@@ -200,17 +200,17 @@ ISABus *isa_bus_from_device(ISADevice *dev)
return ISA_BUS(qdev_get_parent_bus(DEVICE(dev)));
}
-ISADevice *isa_vga_init(ISABus *bus)
+ISADevice *isa_vga_init(Object *parent, ISABus *bus)
{
vga_interface_created = true;
switch (vga_interface_type) {
case VGA_CIRRUS:
- return isa_create_simple_orphan(bus, "isa-cirrus-vga");
+ return isa_create_simple(parent, "vga", bus, "isa-cirrus-vga");
case VGA_QXL:
error_report("%s: qxl: no PCI bus", __func__);
return NULL;
case VGA_STD:
- return isa_create_simple_orphan(bus, "isa-vga");
+ return isa_create_simple(parent, "vga", bus, "isa-vga");
case VGA_VMWARE:
error_report("%s: vmware_vga: no PCI bus", __func__);
return NULL;
diff --git a/hw/mips/fuloong2e.c b/hw/mips/fuloong2e.c
index 88d2901829..477ad99c87 100644
--- a/hw/mips/fuloong2e.c
+++ b/hw/mips/fuloong2e.c
@@ -201,10 +201,10 @@ static void main_cpu_reset(void *opaque)
}
/* Network support */
-static void network_init(PCIBus *pci_bus)
+static void network_init(Object *parent, PCIBus *pci_bus)
{
/* The Fuloong board has a RTL8139 card using PCI SLOT 7 */
- pci_init_nic_in_slot(pci_bus, "rtl8139", NULL, "07");
+ pci_init_nic_in_slot(parent, pci_bus, "rtl8139", NULL, "07");
pci_init_nic_devices(pci_bus, "rtl8139");
}
@@ -326,7 +326,7 @@ static void mips_fuloong2e_init(MachineState *machine)
smbus_eeprom_init_one(OBJECT(machine), smbus, 0x50, spd_data);
/* Network card: RTL8139D */
- network_init(pci_bus);
+ network_init(OBJECT(machine), pci_bus);
}
static void mips_fuloong2e_machine_init(MachineClass *mc)
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index 9ab1edceb2..99d2016ef1 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -460,7 +460,7 @@ static inline void loongson3_virt_devices_init(MachineState *machine,
}
msi_nonbroken = true;
- pci_vga_init(pci_bus);
+ pci_vga_init(OBJECT(machine), pci_bus);
if (defaults_enabled() && object_class_by_name("pci-ohci")) {
USBBus *usb_bus;
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index ebd1456657..e8c130d5bb 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -602,10 +602,10 @@ static MaltaFPGAState *malta_fpga_init(Object *parent, MemoryRegion *address_spa
}
/* Network support */
-static void network_init(PCIBus *pci_bus)
+static void network_init(Object *parent, PCIBus *pci_bus)
{
/* The malta board has a PCNet card using PCI SLOT 11 */
- pci_init_nic_in_slot(pci_bus, "pcnet", NULL, "0b");
+ pci_init_nic_in_slot(parent, pci_bus, "pcnet", NULL, "0b");
pci_init_nic_devices(pci_bus, "pcnet");
}
@@ -1259,10 +1259,10 @@ void mips_malta_init(MachineState *machine)
TYPE_FDC37M81X_SUPERIO);
/* Network card */
- network_init(pci_bus);
+ network_init(OBJECT(machine), pci_bus);
/* Optional PCI video card */
- pci_vga_init(pci_bus);
+ pci_vga_init(OBJECT(machine), pci_bus);
}
static void mips_malta_instance_init(Object *obj)
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 61b9f2a230..ca5882ba59 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -2083,7 +2083,7 @@ void pci_init_nic_devices(PCIBus *bus, const char *default_model)
"virtio", "virtio-net-pci");
}
-bool pci_init_nic_in_slot(PCIBus *rootbus, const char *model,
+bool pci_init_nic_in_slot(Object *parent, PCIBus *rootbus, const char *model,
const char *alias, const char *devaddr)
{
NICInfo *nd = qemu_find_nic_info(model, true, alias);
@@ -2118,26 +2118,26 @@ bool pci_init_nic_in_slot(PCIBus *rootbus, const char *model,
exit(1);
}
- pci_dev = pci_new_orphan(devfn, model);
+ pci_dev = pci_new(parent, "nic[*]", devfn, model);
qdev_set_nic_properties(&pci_dev->qdev, nd);
- pci_realize_and_unref(pci_dev, bus, &error_fatal);
+ qdev_realize(DEVICE(pci_dev), BUS(bus), &error_fatal);
return true;
}
-PCIDevice *pci_vga_init(PCIBus *bus)
+PCIDevice *pci_vga_init(Object *parent, PCIBus *bus)
{
vga_interface_created = true;
switch (vga_interface_type) {
case VGA_CIRRUS:
- return pci_create_simple_orphan(bus, -1, "cirrus-vga");
+ return pci_create_simple(parent, "vga", bus, -1, "cirrus-vga");
case VGA_QXL:
- return pci_create_simple_orphan(bus, -1, "qxl-vga");
+ return pci_create_simple(parent, "vga", bus, -1, "qxl-vga");
case VGA_STD:
- return pci_create_simple_orphan(bus, -1, "VGA");
+ return pci_create_simple(parent, "vga", bus, -1, "VGA");
case VGA_VMWARE:
- return pci_create_simple_orphan(bus, -1, "vmware-svga");
+ return pci_create_simple(parent, "vga", bus, -1, "vmware-svga");
case VGA_VIRTIO:
- return pci_create_simple_orphan(bus, -1, "virtio-vga");
+ return pci_create_simple(parent, "vga", bus, -1, "virtio-vga");
case VGA_NONE:
default: /* Other non-PCI types. Checking for unsupported types is already
done in vl.c. */
diff --git a/hw/ppc/amigaone.c b/hw/ppc/amigaone.c
index faf76f12be..60aed15a6e 100644
--- a/hw/ppc/amigaone.c
+++ b/hw/ppc/amigaone.c
@@ -370,7 +370,7 @@ static void amigaone_init(MachineState *machine)
"pirq", i));
}
pci_ide_create_devs(PCI_DEVICE(object_resolve_path_component(via, "ide")));
- pci_vga_init(pci_bus);
+ pci_vga_init(OBJECT(machine), pci_bus);
if (!machine->kernel_filename) {
return;
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index e9ee44a2f1..a6af53e21a 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -435,7 +435,7 @@ static void ppc_core99_init(MachineState *machine)
}
}
- pci_vga_init(pci_bus);
+ pci_vga_init(OBJECT(machine), pci_bus);
if (!graphic_width) {
graphic_width = 800;
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index 6ef8207f96..f9b62a518a 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -267,7 +267,7 @@ static void ppc_heathrow_init(MachineState *machine)
}
}
- pci_vga_init(pci_bus);
+ pci_vga_init(OBJECT(machine), pci_bus);
pci_init_nic_devices(pci_bus, mc->default_nic);
diff --git a/hw/ppc/pegasos.c b/hw/ppc/pegasos.c
index 6ce1e3f174..4917d8137a 100644
--- a/hw/ppc/pegasos.c
+++ b/hw/ppc/pegasos.c
@@ -267,7 +267,7 @@ static void pegasos_init(MachineState *machine)
smbus_eeprom_init_one(OBJECT(machine), i2c_bus, 0x57, spd_data);
/* other PC hardware */
- pci_vga_init(pci_bus);
+ pci_vga_init(OBJECT(machine), pci_bus);
/* pci interrupt routing */
switch (pm->type) {
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index ff85a4e64b..52f94b206a 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -357,10 +357,10 @@ static void ibm_40p_init(MachineState *machine)
qdev_connect_gpio_out(dev, 0, qdev_get_gpio_in(i82378_dev, 13));
/* XXX: s3-trio at PCI_DEVFN(2, 0) */
- pci_vga_init(pci_bus);
+ pci_vga_init(OBJECT(machine), pci_bus);
/* First PCNET device at PCI_DEVFN(3, 0) */
- pci_init_nic_in_slot(pci_bus, mc->default_nic, NULL, "3");
+ pci_init_nic_in_slot(OBJECT(machine), pci_bus, mc->default_nic, NULL, "3");
pci_init_nic_devices(pci_bus, mc->default_nic);
}
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index fbf6c59516..9b6b5e7257 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1909,7 +1909,7 @@ static void spapr_rtc_create(SpaprMachineState *spapr)
}
/* Returns whether we want to use VGA or not */
-static bool spapr_vga_init(PCIBus *pci_bus, Error **errp)
+static bool spapr_vga_init(Object *parent, PCIBus *pci_bus, Error **errp)
{
vga_interface_created = true;
switch (vga_interface_type) {
@@ -1920,7 +1920,7 @@ static bool spapr_vga_init(PCIBus *pci_bus, Error **errp)
case VGA_STD:
case VGA_VIRTIO:
case VGA_CIRRUS:
- return pci_vga_init(pci_bus) != NULL;
+ return pci_vga_init(parent, pci_bus) != NULL;
default:
error_setg(errp,
"Unsupported VGA mode, only -vga std or -vga virtio is supported");
@@ -3066,7 +3066,7 @@ static void spapr_machine_init(MachineState *machine)
}
/* Graphics */
- has_vga = spapr_vga_init(phb->bus, &error_fatal);
+ has_vga = spapr_vga_init(OBJECT(machine), phb->bus, &error_fatal);
if (has_vga) {
spapr->want_stdout_path = !machine->enable_graphics;
machine->usb |= defaults_enabled() && !machine->usb_disabled;
diff --git a/hw/riscv/boston-aia.c b/hw/riscv/boston-aia.c
index 3b0eba00a7..5a9ec28068 100644
--- a/hw/riscv/boston-aia.c
+++ b/hw/riscv/boston-aia.c
@@ -428,7 +428,8 @@ static void boston_mach_init(MachineState *machine)
ahci_ide_create_devs(&ich9->ahci, hd);
/* Create e1000e using slot 0 func 1 */
- pci_init_nic_in_slot(&PCI_BRIDGE(&pcie2->root)->sec_bus, "e1000e", NULL,
+ pci_init_nic_in_slot(OBJECT(machine), &PCI_BRIDGE(&pcie2->root)->sec_bus,
+ "e1000e", NULL,
"00.1");
pci_init_nic_devices(&PCI_BRIDGE(&pcie2->root)->sec_bus, "e1000e");
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index c03df91aca..6154aed2c4 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -315,7 +315,7 @@ static void r2d_init(MachineState *machine)
0x555, 0x2aa, 0);
/* NIC: rtl8139 on-board, and 2 slots. */
- pci_init_nic_in_slot(pci_bus, mc->default_nic, NULL, "2");
+ pci_init_nic_in_slot(OBJECT(machine), pci_bus, mc->default_nic, NULL, "2");
pci_init_nic_devices(pci_bus, mc->default_nic);
/* USB keyboard */
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index dbaf61bcf1..a059409243 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -183,7 +183,7 @@ void pc_memory_init(PCMachineState *pcms,
MemoryRegion *rom_memory,
uint64_t pci_hole64_size);
uint64_t pc_pci_hole64_start(void);
-DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus);
+DeviceState *pc_vga_init(Object *parent, ISABus *isa_bus, PCIBus *pci_bus);
void pc_basic_device_init(struct PCMachineState *pcms,
ISABus *isa_bus, qemu_irq *gsi,
ISADevice *rtc_state,
diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h
index af8e07c253..9e35d88b1e 100644
--- a/include/hw/isa/isa.h
+++ b/include/hw/isa/isa.h
@@ -89,7 +89,7 @@ ISADevice *isa_try_new_orphan(const char *name);
bool isa_realize_and_unref(ISADevice *dev, ISABus *bus, Error **errp);
ISADevice *isa_create_simple_orphan(ISABus *bus, const char *name);
-ISADevice *isa_vga_init(ISABus *bus);
+ISADevice *isa_vga_init(Object *parent, ISABus *bus);
qemu_irq isa_get_irq(ISADevice *dev, unsigned isairq);
void isa_connect_gpio_out(ISADevice *isadev, int gpioirq, unsigned isairq);
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index cbbb6a3756..9c6bcc0b96 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -337,9 +337,9 @@ void pci_device_set_intx_routing_notifier(PCIDevice *dev,
void pci_device_reset(PCIDevice *dev);
void pci_init_nic_devices(PCIBus *bus, const char *default_model);
-bool pci_init_nic_in_slot(PCIBus *rootbus, const char *default_model,
+bool pci_init_nic_in_slot(Object *parent, PCIBus *rootbus, const char *default_model,
const char *alias, const char *devaddr);
-PCIDevice *pci_vga_init(PCIBus *bus);
+PCIDevice *pci_vga_init(Object *parent, PCIBus *bus);
static inline PCIBus *pci_get_bus(const PCIDevice *dev)
{
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 056/134] hw/arm/virt: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (54 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 055/134] hw/pci, hw/isa: Give VGA and slot-NIC helpers " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 057/134] hw/arm/sbsa-ref: " Alexander Graf
` (78 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in hw/arm/virt.c to the
new parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/virt.c:1085 | qdev_new | OBJECT(vms) | "acpi-ged" | helper receives VirtMachineState* board pointer
hw/arm/virt.c:1123 | qdev_new | OBJECT(vms) | "its" | helper receives VirtMachineState* board pointer
hw/arm/virt.c:1140 | qdev_new | OBJECT(vms) | "gicv2m" | helper receives VirtMachineState* board pointer
hw/arm/virt.c:1228 | qdev_new | OBJECT(vms) | "gic" | helper receives VirtMachineState* board pointer
hw/arm/virt.c:1359 | qdev_new | OBJECT(vms) | "gic" | helper receives VirtMachineState* board pointer; only one of gicv2/gicv3/gicv5 created
hw/arm/virt.c:1415 | qdev_new | OBJECT(vms) | "gic" | helper receives VirtMachineState* board pointer; only one of gicv2/gicv3/gicv5 created
hw/arm/virt.c:1512 | qdev_new | OBJECT(vms) | "uart[*]" | helper receives VirtMachineState*; called up to 2x -> auto-index; drop const
hw/arm/virt.c:1564 | sysbus_create_simple | OBJECT(vms) | "rtc" | helper receives VirtMachineState* board pointer; drop const
hw/arm/virt.c:1609 | sysbus_create_simple | parent | "gpio-key" | helper lacks parent pointer -> thread Object *parent from create_gpio_devices
hw/arm/virt.c:1634 | sysbus_create_simple | parent | "gpio-pwr" | helper lacks parent pointer -> thread Object *parent from create_gpio_devices
hw/arm/virt.c:1673 | qdev_new | OBJECT(vms) | "gpio[*]" | helper receives VirtMachineState*; called for VIRT_GPIO and VIRT_SECURE_GPIO -> auto-index; drop const
hw/arm/virt.c:1749 | sysbus_create_simple | OBJECT(vms) | "virtio-mmio[*]" | loop over transports; drop const
hw/arm/virt.c:1789 | qdev_new | OBJECT(vms) | name | collapse existing object_property_add_child(OBJECT(vms), name, ...) into qdev_new; keep existing name; virt_flash_map1 realize -> sysbus_realize
hw/arm/virt.c:2072 | qdev_new | OBJECT(vms) | "smmuv3" | helper receives VirtMachineState* board pointer; drop const
hw/arm/virt.c:2165 | qdev_new | OBJECT(vms) | "pcie" | helper receives VirtMachineState* board pointer
hw/arm/virt.c:2293 | qdev_new | OBJECT(vms) | "platform-bus" | helper receives VirtMachineState* board pointer
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/virt.c | 80 +++++++++++++++++++++++++--------------------------
1 file changed, 40 insertions(+), 40 deletions(-)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 686dde5996..ea51a5f3bd 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1082,11 +1082,11 @@ static inline DeviceState *create_acpi_ged(VirtMachineState *vms)
event |= ACPI_GED_NVDIMM_HOTPLUG_EVT;
}
- dev = qdev_new_orphan(TYPE_ACPI_GED);
+ dev = qdev_new(OBJECT(vms), "acpi-ged", TYPE_ACPI_GED);
qdev_prop_set_uint32(dev, "ged-event", event);
object_property_set_link(OBJECT(dev), "bus", OBJECT(vms->bus), &error_abort);
sbdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sbdev, &error_fatal);
+ sysbus_realize(sbdev, &error_fatal);
sysbus_mmio_map_name(sbdev, TYPE_ACPI_GED, vms->memmap[VIRT_ACPI_GED].base);
sysbus_mmio_map_name(sbdev, ACPI_MEMHP_REGION_NAME,
@@ -1120,11 +1120,11 @@ static void create_its(VirtMachineState *vms)
return;
}
- dev = qdev_new_orphan(its_class_name());
+ dev = qdev_new(OBJECT(vms), "gic-its", its_class_name());
object_property_set_link(OBJECT(dev), "parent-gicv3", OBJECT(vms->gic),
&error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_ITS].base);
fdt_add_its_gic_node(vms);
@@ -1137,10 +1137,10 @@ static void create_v2m(VirtMachineState *vms)
int irq = vms->irqmap[VIRT_GIC_V2M];
DeviceState *dev;
- dev = qdev_new_orphan("arm-gicv2m");
+ dev = qdev_new(OBJECT(vms), "gicv2m", "arm-gicv2m");
qdev_prop_set_uint32(dev, "base-spi", irq);
qdev_prop_set_uint32(dev, "num-spi", NUM_GICV2M_SPIS);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_V2M].base);
for (i = 0; i < NUM_GICV2M_SPIS; i++) {
@@ -1225,7 +1225,7 @@ static void create_gicv5(VirtMachineState *vms, MemoryRegion *mem)
const char *gictype = gicv5_class_name();
QList *cpulist = qlist_new(), *iaffidlist = qlist_new();
- vms->gic = qdev_new_orphan(gictype);
+ vms->gic = qdev_new(OBJECT(vms), "gic", gictype);
qdev_prop_set_uint32(vms->gic, "spi-range", NUM_IRQS);
object_property_set_link(OBJECT(vms->gic), "sysmem", OBJECT(mem),
@@ -1243,7 +1243,7 @@ static void create_gicv5(VirtMachineState *vms, MemoryRegion *mem)
qdev_prop_set_array(vms->gic, "cpu-iaffids", iaffidlist);
gicbusdev = SYS_BUS_DEVICE(vms->gic);
- sysbus_realize_and_unref(gicbusdev, &error_fatal);
+ sysbus_realize(gicbusdev, &error_fatal);
/*
* Map the IRS config frames for the interrupt domains.
@@ -1356,7 +1356,7 @@ static void create_gicv2(VirtMachineState *vms, MemoryRegion *mem)
exit(1);
}
- vms->gic = qdev_new_orphan(gic_class_name());
+ vms->gic = qdev_new(OBJECT(vms), "gic", gic_class_name());
qdev_prop_set_uint32(vms->gic, "revision", 2);
qdev_prop_set_uint32(vms->gic, "num-cpu", smp_cpus);
/*
@@ -1370,7 +1370,7 @@ static void create_gicv2(VirtMachineState *vms, MemoryRegion *mem)
}
gicbusdev = SYS_BUS_DEVICE(vms->gic);
- sysbus_realize_and_unref(gicbusdev, &error_fatal);
+ sysbus_realize(gicbusdev, &error_fatal);
sysbus_mmio_map(gicbusdev, 0, vms->memmap[VIRT_GIC_DIST].base);
sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_CPU].base);
if (vms->virt) {
@@ -1412,7 +1412,7 @@ static void create_gicv3(VirtMachineState *vms, MemoryRegion *mem)
exit(1);
}
- vms->gic = qdev_new_orphan(gicv3_class_name());
+ vms->gic = qdev_new(OBJECT(vms), "gic", gicv3_class_name());
qdev_prop_set_uint32(vms->gic, "revision", revision);
qdev_prop_set_uint32(vms->gic, "num-cpu", smp_cpus);
/*
@@ -1454,7 +1454,7 @@ static void create_gicv3(VirtMachineState *vms, MemoryRegion *mem)
}
gicbusdev = SYS_BUS_DEVICE(vms->gic);
- sysbus_realize_and_unref(gicbusdev, &error_fatal);
+ sysbus_realize(gicbusdev, &error_fatal);
sysbus_mmio_map(gicbusdev, 0, vms->memmap[VIRT_GIC_DIST].base);
sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_REDIST].base);
if (nb_redist_regions == 2) {
@@ -1500,7 +1500,7 @@ static void create_msi_controller(VirtMachineState *vms)
}
}
-static void create_uart(const VirtMachineState *vms, int uart,
+static void create_uart(VirtMachineState *vms, int uart,
MemoryRegion *mem, Chardev *chr, bool secure)
{
char *nodename;
@@ -1509,12 +1509,12 @@ static void create_uart(const VirtMachineState *vms, int uart,
int irq = vms->irqmap[uart];
const char compat[] = "arm,pl011\0arm,primecell";
const char clocknames[] = "uartclk\0apb_pclk";
- DeviceState *dev = qdev_new_orphan(TYPE_PL011);
+ DeviceState *dev = qdev_new(OBJECT(vms), "uart[*]", TYPE_PL011);
SysBusDevice *s = SYS_BUS_DEVICE(dev);
MachineState *ms = MACHINE(vms);
qdev_prop_set_chr(dev, "chardev", chr);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
memory_region_add_subregion(mem, base,
sysbus_mmio_get_region(s, 0));
sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq));
@@ -1552,7 +1552,7 @@ static void create_uart(const VirtMachineState *vms, int uart,
g_free(nodename);
}
-static void create_rtc(const VirtMachineState *vms)
+static void create_rtc(VirtMachineState *vms)
{
char *nodename;
hwaddr base = vms->memmap[VIRT_RTC].base;
@@ -1561,7 +1561,8 @@ static void create_rtc(const VirtMachineState *vms)
const char compat[] = "arm,pl031\0arm,primecell";
MachineState *ms = MACHINE(vms);
- sysbus_create_simple_orphan("pl031", base, qdev_get_gpio_in(vms->gic, irq));
+ sysbus_create_simple(OBJECT(vms), "rtc", "pl031", base,
+ qdev_get_gpio_in(vms->gic, irq));
nodename = g_strdup_printf("/pl031@%" PRIx64, base);
qemu_fdt_add_subnode(ms->fdt, nodename);
@@ -1603,10 +1604,10 @@ static void virt_generic_error_req(Notifier *n, void *opaque)
acpi_send_event(s->acpi_dev, ACPI_GENERIC_ERROR);
}
-static void create_gpio_keys(char *fdt, DeviceState *pl061_dev,
+static void create_gpio_keys(Object *parent, char *fdt, DeviceState *pl061_dev,
uint32_t phandle)
{
- gpio_key_dev = sysbus_create_simple_orphan("gpio-key", -1,
+ gpio_key_dev = sysbus_create_simple(parent, "gpio-key", "gpio-key", -1,
qdev_get_gpio_in(pl061_dev,
GPIO_PIN_POWER_BUTTON));
@@ -1625,13 +1626,13 @@ static void create_gpio_keys(char *fdt, DeviceState *pl061_dev,
#define SECURE_GPIO_POWEROFF 0
#define SECURE_GPIO_RESET 1
-static void create_secure_gpio_pwr(char *fdt, DeviceState *pl061_dev,
- uint32_t phandle)
+static void create_secure_gpio_pwr(Object *parent, char *fdt,
+ DeviceState *pl061_dev, uint32_t phandle)
{
DeviceState *gpio_pwr_dev;
/* gpio-pwr */
- gpio_pwr_dev = sysbus_create_simple_orphan("gpio-pwr", -1, NULL);
+ gpio_pwr_dev = sysbus_create_simple(parent, "gpio-pwr", "gpio-pwr", -1, NULL);
/* connect secure pl061 to gpio-pwr */
qdev_connect_gpio_out(pl061_dev, SECURE_GPIO_RESET,
@@ -1658,7 +1659,7 @@ static void create_secure_gpio_pwr(char *fdt, DeviceState *pl061_dev,
"okay");
}
-static void create_gpio_devices(const VirtMachineState *vms, int gpio,
+static void create_gpio_devices(VirtMachineState *vms, int gpio,
MemoryRegion *mem)
{
char *nodename;
@@ -1670,12 +1671,12 @@ static void create_gpio_devices(const VirtMachineState *vms, int gpio,
SysBusDevice *s;
MachineState *ms = MACHINE(vms);
- pl061_dev = qdev_new_orphan("pl061");
+ pl061_dev = qdev_new(OBJECT(vms), "gpio[*]", "pl061");
/* Pull lines down to 0 if not driven by the PL061 */
qdev_prop_set_uint8(pl061_dev, "pullups", 0);
qdev_prop_set_uint8(pl061_dev, "pulldowns", 0xff);
s = SYS_BUS_DEVICE(pl061_dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
memory_region_add_subregion(mem, base, sysbus_mmio_get_region(s, 0));
sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq));
@@ -1703,13 +1704,13 @@ static void create_gpio_devices(const VirtMachineState *vms, int gpio,
/* Child gpio devices */
if (gpio == VIRT_GPIO) {
- create_gpio_keys(ms->fdt, pl061_dev, phandle);
+ create_gpio_keys(OBJECT(vms), ms->fdt, pl061_dev, phandle);
} else {
- create_secure_gpio_pwr(ms->fdt, pl061_dev, phandle);
+ create_secure_gpio_pwr(OBJECT(vms), ms->fdt, pl061_dev, phandle);
}
}
-static void create_virtio_devices(const VirtMachineState *vms)
+static void create_virtio_devices(VirtMachineState *vms)
{
int i;
hwaddr size = vms->memmap[VIRT_MMIO].size;
@@ -1746,8 +1747,8 @@ static void create_virtio_devices(const VirtMachineState *vms)
int irq = vms->irqmap[VIRT_MMIO] + i;
hwaddr base = vms->memmap[VIRT_MMIO].base + i * size;
- sysbus_create_simple_orphan("virtio-mmio", base,
- qdev_get_gpio_in(vms->gic, irq));
+ sysbus_create_simple(OBJECT(vms), "virtio-mmio[*]", "virtio-mmio",
+ base, qdev_get_gpio_in(vms->gic, irq));
}
/* We add dtb nodes in reverse order so that they appear in the finished
@@ -1786,7 +1787,7 @@ static PFlashCFI01 *virt_flash_create1(VirtMachineState *vms,
* Create a single flash device. We use the same parameters as
* the flash devices on the Versatile Express board.
*/
- DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new(OBJECT(vms), name, TYPE_PFLASH_CFI01);
qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE);
qdev_prop_set_uint8(dev, "width", 4);
@@ -1797,7 +1798,6 @@ static PFlashCFI01 *virt_flash_create1(VirtMachineState *vms,
qdev_prop_set_uint16(dev, "id2", 0x00);
qdev_prop_set_uint16(dev, "id3", 0x00);
qdev_prop_set_string(dev, "name", name);
- object_property_add_child(OBJECT(vms), name, OBJECT(dev));
object_property_add_alias(OBJECT(vms), alias_prop_name,
OBJECT(dev), "drive");
return PFLASH_CFI01(dev);
@@ -1818,7 +1818,7 @@ static void virt_flash_map1(PFlashCFI01 *flash,
assert(QEMU_IS_ALIGNED(size, VIRT_FLASH_SECTOR_SIZE));
assert(size / VIRT_FLASH_SECTOR_SIZE <= UINT32_MAX);
qdev_prop_set_uint32(dev, "num-blocks", size / VIRT_FLASH_SECTOR_SIZE);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
memory_region_add_subregion(sysmem, base,
sysbus_mmio_get_region(SYS_BUS_DEVICE(dev),
@@ -2056,7 +2056,7 @@ static void create_smmuv3_dev_dtb(VirtMachineState *vms, DeviceState *dev,
0x0, vms->iommu_phandle, 0x0, 0x10000);
}
-static void create_smmu(const VirtMachineState *vms, PCIBus *bus)
+static void create_smmu(VirtMachineState *vms, PCIBus *bus)
{
VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
int irq = vms->irqmap[VIRT_SMMU];
@@ -2069,7 +2069,7 @@ static void create_smmu(const VirtMachineState *vms, PCIBus *bus)
return;
}
- dev = qdev_new_orphan(TYPE_ARM_SMMUV3);
+ dev = qdev_new(OBJECT(vms), "smmuv3", TYPE_ARM_SMMUV3);
if (!vmc->no_nested_smmu) {
object_property_set_str(OBJECT(dev), "stage", "nested", &error_fatal);
@@ -2080,7 +2080,7 @@ static void create_smmu(const VirtMachineState *vms, PCIBus *bus)
&error_abort);
object_property_set_link(OBJECT(dev), "secure-memory", OBJECT(vms->secure_sysmem),
&error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
for (i = 0; i < NUM_SMMU_IRQS; i++) {
sysbus_connect_irq(SYS_BUS_DEVICE(dev), i,
@@ -2162,8 +2162,8 @@ static void create_pcie(VirtMachineState *vms)
MachineState *ms = MACHINE(vms);
MachineClass *mc = MACHINE_GET_CLASS(ms);
- dev = qdev_new_orphan(TYPE_GPEX_HOST);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(vms), "pcie", TYPE_GPEX_HOST);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
ecam_id = VIRT_ECAM_ID(vms->highmem_ecam);
base_ecam = vms->memmap[ecam_id].base;
@@ -2290,11 +2290,11 @@ static void create_platform_bus(VirtMachineState *vms)
int i;
MemoryRegion *sysmem = get_system_memory();
- dev = qdev_new_orphan(TYPE_PLATFORM_BUS_DEVICE);
+ dev = qdev_new(OBJECT(vms), "platform-bus", TYPE_PLATFORM_BUS_DEVICE);
dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE);
qdev_prop_set_uint32(dev, "num_irqs", PLATFORM_BUS_NUM_IRQS);
qdev_prop_set_uint32(dev, "mmio_size", vms->memmap[VIRT_PLATFORM_BUS].size);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
vms->platform_bus_dev = dev;
s = SYS_BUS_DEVICE(dev);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 057/134] hw/arm/sbsa-ref: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (55 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 056/134] hw/arm/virt: Give onboard devices " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 058/134] hw/arm/xilinx-zynq: " Alexander Graf
` (77 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm sbsa-ref
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/sbsa-ref.c:299 | qdev_new | OBJECT(sms) | name | collapse existing object_property_add_child(OBJECT(sms), name, ...); keep existing name; sbsa_flash_map1 realize -> sysbus_realize
hw/arm/sbsa-ref.c:424 | qdev_new | OBJECT(sms) | "its" | helper receives SBSAMachineState* board pointer
hw/arm/sbsa-ref.c:443 | qdev_new | OBJECT(sms) | "gic" | helper receives SBSAMachineState* board pointer
hw/arm/sbsa-ref.c:525 | qdev_new | OBJECT(sms) | "uart[*]" | helper called 3x from board init -> auto-index; drop const
hw/arm/sbsa-ref.c:540 | sysbus_create_simple | OBJECT(sms) | "rtc" | helper receives SBSAMachineState*; drop const
hw/arm/sbsa-ref.c:547 | qdev_new | OBJECT(sms) | "wdt" | helper receives SBSAMachineState*; drop const
hw/arm/sbsa-ref.c:575 | sysbus_create_simple | OBJECT(sms) | "gpio" | helper receives SBSAMachineState*; drop const
hw/arm/sbsa-ref.c:578 | sysbus_create_simple | OBJECT(sms) | "gpio-key" | helper receives SBSAMachineState*
hw/arm/sbsa-ref.c:593 | qdev_new | OBJECT(sms) | "ahci" | helper receives SBSAMachineState*; drop const
hw/arm/sbsa-ref.c:608 | qdev_new | OBJECT(sms) | "xhci" | helper receives SBSAMachineState*; drop const
hw/arm/sbsa-ref.c:625 | qdev_new | OBJECT(sms) | "smmuv3" | helper receives SBSAMachineState*; drop const
hw/arm/sbsa-ref.c:661 | qdev_new | OBJECT(sms) | "pcie" | helper receives SBSAMachineState*
hw/arm/sbsa-ref.c:698 | pci_create_simple | OBJECT(sms) | "bochs-display" | board owns lifetime; bus is plug location not parent
hw/arm/sbsa-ref.c:715 | qdev_new | parent | "sbsa-ec" | helper lacks parent-capable pointer -> thread Object *parent from sbsa_ref_init
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/sbsa-ref.c | 70 ++++++++++++++++++++++++-----------------------
1 file changed, 36 insertions(+), 34 deletions(-)
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
index f9fb681d31..f632df742b 100644
--- a/hw/arm/sbsa-ref.c
+++ b/hw/arm/sbsa-ref.c
@@ -296,7 +296,7 @@ static PFlashCFI01 *sbsa_flash_create1(SBSAMachineState *sms,
* Create a single flash device. We use the same parameters as
* the flash devices on the Versatile Express board.
*/
- DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new(OBJECT(sms), name, TYPE_PFLASH_CFI01);
qdev_prop_set_uint64(dev, "sector-length", SBSA_FLASH_SECTOR_SIZE);
qdev_prop_set_uint8(dev, "width", 4);
@@ -307,7 +307,6 @@ static PFlashCFI01 *sbsa_flash_create1(SBSAMachineState *sms,
qdev_prop_set_uint16(dev, "id2", 0x00);
qdev_prop_set_uint16(dev, "id3", 0x00);
qdev_prop_set_string(dev, "name", name);
- object_property_add_child(OBJECT(sms), name, OBJECT(dev));
object_property_add_alias(OBJECT(sms), alias_prop_name,
OBJECT(dev), "drive");
return PFLASH_CFI01(dev);
@@ -328,7 +327,7 @@ static void sbsa_flash_map1(PFlashCFI01 *flash,
assert(QEMU_IS_ALIGNED(size, SBSA_FLASH_SECTOR_SIZE));
assert(size / SBSA_FLASH_SECTOR_SIZE <= UINT32_MAX);
qdev_prop_set_uint32(dev, "num-blocks", size / SBSA_FLASH_SECTOR_SIZE);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
memory_region_add_subregion(sysmem, base,
sysbus_mmio_get_region(SYS_BUS_DEVICE(dev),
@@ -421,11 +420,11 @@ static void create_its(SBSAMachineState *sms)
const char *itsclass = its_class_name();
DeviceState *dev;
- dev = qdev_new_orphan(itsclass);
+ dev = qdev_new(OBJECT(sms), "its", itsclass);
object_property_set_link(OBJECT(dev), "parent-gicv3", OBJECT(sms->gic),
&error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, sbsa_ref_memmap[SBSA_GIC_ITS].base);
}
@@ -440,7 +439,7 @@ static void create_gic(SBSAMachineState *sms, MemoryRegion *mem)
gictype = gicv3_class_name();
- sms->gic = qdev_new_orphan(gictype);
+ sms->gic = qdev_new(OBJECT(sms), "gic", gictype);
qdev_prop_set_uint32(sms->gic, "revision", 3);
qdev_prop_set_uint32(sms->gic, "num-cpu", smp_cpus);
/*
@@ -463,7 +462,7 @@ static void create_gic(SBSAMachineState *sms, MemoryRegion *mem)
qdev_prop_set_bit(sms->gic, "has-lpi", true);
gicbusdev = SYS_BUS_DEVICE(sms->gic);
- sysbus_realize_and_unref(gicbusdev, &error_fatal);
+ sysbus_realize(gicbusdev, &error_fatal);
sysbus_mmio_map(gicbusdev, 0, sbsa_ref_memmap[SBSA_GIC_DIST].base);
sysbus_mmio_map(gicbusdev, 1, sbsa_ref_memmap[SBSA_GIC_REDIST].base);
@@ -517,39 +516,40 @@ static void create_gic(SBSAMachineState *sms, MemoryRegion *mem)
create_its(sms);
}
-static void create_uart(const SBSAMachineState *sms, int uart,
+static void create_uart(SBSAMachineState *sms, int uart,
MemoryRegion *mem, Chardev *chr)
{
hwaddr base = sbsa_ref_memmap[uart].base;
int irq = sbsa_ref_irqmap[uart];
- DeviceState *dev = qdev_new_orphan(TYPE_PL011);
+ DeviceState *dev = qdev_new(OBJECT(sms), "uart[*]", TYPE_PL011);
SysBusDevice *s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", chr);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
memory_region_add_subregion(mem, base,
sysbus_mmio_get_region(s, 0));
sysbus_connect_irq(s, 0, qdev_get_gpio_in(sms->gic, irq));
}
-static void create_rtc(const SBSAMachineState *sms)
+static void create_rtc(SBSAMachineState *sms)
{
hwaddr base = sbsa_ref_memmap[SBSA_RTC].base;
int irq = sbsa_ref_irqmap[SBSA_RTC];
- sysbus_create_simple_orphan("pl031", base, qdev_get_gpio_in(sms->gic, irq));
+ sysbus_create_simple(OBJECT(sms), "rtc", "pl031", base,
+ qdev_get_gpio_in(sms->gic, irq));
}
-static void create_wdt(const SBSAMachineState *sms)
+static void create_wdt(SBSAMachineState *sms)
{
hwaddr rbase = sbsa_ref_memmap[SBSA_GWDT_REFRESH].base;
hwaddr cbase = sbsa_ref_memmap[SBSA_GWDT_CONTROL].base;
- DeviceState *dev = qdev_new_orphan(TYPE_WDT_SBSA);
+ DeviceState *dev = qdev_new(OBJECT(sms), "wdt", TYPE_WDT_SBSA);
SysBusDevice *s = SYS_BUS_DEVICE(dev);
int irq = sbsa_ref_irqmap[SBSA_GWDT_WS0];
qdev_prop_set_uint64(dev, "clock-frequency", SBSA_GTIMER_HZ);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, rbase);
sysbus_mmio_map(s, 1, cbase);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(sms->gic, irq));
@@ -566,23 +566,23 @@ static Notifier sbsa_ref_powerdown_notifier = {
.notify = sbsa_ref_powerdown_req
};
-static void create_gpio(const SBSAMachineState *sms)
+static void create_gpio(SBSAMachineState *sms)
{
DeviceState *pl061_dev;
hwaddr base = sbsa_ref_memmap[SBSA_GPIO].base;
int irq = sbsa_ref_irqmap[SBSA_GPIO];
- pl061_dev = sysbus_create_simple_orphan("pl061", base,
+ pl061_dev = sysbus_create_simple(OBJECT(sms), "gpio", "pl061", base,
qdev_get_gpio_in(sms->gic, irq));
- gpio_key_dev = sysbus_create_simple_orphan("gpio-key", -1,
- qdev_get_gpio_in(pl061_dev, 3));
+ gpio_key_dev = sysbus_create_simple(OBJECT(sms), "gpio-key", "gpio-key",
+ -1, qdev_get_gpio_in(pl061_dev, 3));
/* connect powerdown request */
qemu_register_powerdown_notifier(&sbsa_ref_powerdown_notifier);
}
-static void create_ahci(const SBSAMachineState *sms)
+static void create_ahci(SBSAMachineState *sms)
{
hwaddr base = sbsa_ref_memmap[SBSA_AHCI].base;
int irq = sbsa_ref_irqmap[SBSA_AHCI];
@@ -590,9 +590,9 @@ static void create_ahci(const SBSAMachineState *sms)
DriveInfo *hd[NUM_SATA_PORTS];
SysbusAHCIState *sysahci;
- dev = qdev_new_orphan("sysbus-ahci");
+ dev = qdev_new(OBJECT(sms), "ahci", "sysbus-ahci");
qdev_prop_set_uint32(dev, "num-ports", NUM_SATA_PORTS);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, qdev_get_gpio_in(sms->gic, irq));
@@ -601,19 +601,19 @@ static void create_ahci(const SBSAMachineState *sms)
ahci_ide_create_devs(&sysahci->ahci, hd);
}
-static void create_xhci(const SBSAMachineState *sms)
+static void create_xhci(SBSAMachineState *sms)
{
hwaddr base = sbsa_ref_memmap[SBSA_XHCI].base;
int irq = sbsa_ref_irqmap[SBSA_XHCI];
- DeviceState *dev = qdev_new_orphan(TYPE_XHCI_SYSBUS);
+ DeviceState *dev = qdev_new(OBJECT(sms), "xhci", TYPE_XHCI_SYSBUS);
qdev_prop_set_uint32(dev, "slots", XHCI_MAXSLOTS);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, qdev_get_gpio_in(sms->gic, irq));
}
-static void create_smmu(const SBSAMachineState *sms, PCIBus *bus,
+static void create_smmu(SBSAMachineState *sms, PCIBus *bus,
MemoryRegion *sysmem,
MemoryRegion *secure_sysmem)
{
@@ -622,7 +622,7 @@ static void create_smmu(const SBSAMachineState *sms, PCIBus *bus,
DeviceState *dev;
int i;
- dev = qdev_new_orphan(TYPE_ARM_SMMUV3);
+ dev = qdev_new(OBJECT(sms), "smmuv3", TYPE_ARM_SMMUV3);
object_property_set_str(OBJECT(dev), "stage", "nested", &error_abort);
object_property_set_link(OBJECT(dev), "primary-bus", OBJECT(bus),
@@ -631,7 +631,7 @@ static void create_smmu(const SBSAMachineState *sms, PCIBus *bus,
&error_abort);
object_property_set_link(OBJECT(dev), "secure-memory", OBJECT(secure_sysmem),
&error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
for (i = 0; i < NUM_SMMU_IRQS; i++) {
sysbus_connect_irq(SYS_BUS_DEVICE(dev), i,
@@ -658,8 +658,8 @@ static void create_pcie(SBSAMachineState *sms,
PCIHostState *pci;
int i;
- dev = qdev_new_orphan(TYPE_GPEX_HOST);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(sms), "pcie", TYPE_GPEX_HOST);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
/* Map ECAM space */
ecam_alias = g_new0(MemoryRegion, 1);
@@ -695,7 +695,7 @@ static void create_pcie(SBSAMachineState *sms,
pci_init_nic_devices(pci->bus, mc->default_nic);
- pci_create_simple_orphan(pci->bus, -1, "bochs-display");
+ pci_create_simple(OBJECT(sms), "bochs-display", pci->bus, -1, "bochs-display");
create_smmu(sms, pci->bus, sysmem, secure_sysmem);
}
@@ -709,12 +709,14 @@ static void *sbsa_ref_dtb(const struct arm_boot_info *binfo, int *fdt_size)
return board->fdt;
}
-static void create_secure_ec(MemoryRegion *mem)
+static void create_secure_ec(Object *parent, MemoryRegion *mem)
{
hwaddr base = sbsa_ref_memmap[SBSA_SECURE_EC].base;
- DeviceState *dev = qdev_new_orphan("sbsa-ec");
+ DeviceState *dev = qdev_new(parent, "sbsa-ec", "sbsa-ec");
SysBusDevice *s = SYS_BUS_DEVICE(dev);
+ sysbus_realize(s, &error_fatal);
+
memory_region_add_subregion(mem, base,
sysbus_mmio_get_region(s, 0));
}
@@ -835,7 +837,7 @@ static void sbsa_ref_init(MachineState *machine)
create_pcie(sms, sysmem, secure_sysmem);
- create_secure_ec(secure_sysmem);
+ create_secure_ec(OBJECT(sms), secure_sysmem);
sms->bootinfo.ram_size = machine->ram_size;
sms->bootinfo.board_id = -1;
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 058/134] hw/arm/xilinx-zynq: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (56 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 057/134] hw/arm/sbsa-ref: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 059/134] hw/arm/xlnx-versal, xlnx-zynqmp: " Alexander Graf
` (76 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm xilinx-zynq
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/xilinx_zynq.c:113 | qdev_new | parent | "gem[*]" | thread Object *parent into gem_init(); board init callers pass OBJECT(machine); sysbus_realize
hw/arm/xilinx_zynq.c:134 | qdev_new | parent | is_qspi?"qspi":"spi[*]" | thread Object *parent into zynq_init_spi_flashes(); sysbus_realize
hw/arm/xilinx_zynq.c:155 | qdev_new | OBJECT(dev) | "flash[*]" | flash owned by SPI controller; qdev_realize
hw/arm/xilinx_zynq.c:198 | qdev_new | parent | "ddr-ctrl" | thread Object *parent into ddr_ctrl_init(); sysbus_realize
hw/arm/xilinx_zynq.c:259 | qdev_new | OBJECT(machine) | "slcr" | board init; sysbus_realize
hw/arm/xilinx_zynq.c:265 | qdev_new | OBJECT(machine) | "a9mpcore" | board init; sysbus_realize
hw/arm/xilinx_zynq.c:272 | sysbus_create_varargs | OBJECT(machine) | "l2x0" | board init; create_simple realizes internally
hw/arm/xilinx_zynq.c:290 | sysbus_create_simple | OBJECT(machine) | "usb[*]" | board init; two ChipIdea USB controllers
hw/arm/xilinx_zynq.c:291 | sysbus_create_simple | OBJECT(machine) | "usb[*]" | board init
hw/arm/xilinx_zynq.c:293 | qdev_new | OBJECT(machine) | "uart[*]" | board init; sysbus_realize
hw/arm/xilinx_zynq.c:301 | qdev_new | OBJECT(machine) | "uart[*]" | board init; sysbus_realize
hw/arm/xilinx_zynq.c:310 | sysbus_create_varargs | OBJECT(machine) | "ttc[*]" | board init; two Cadence TTCs
hw/arm/xilinx_zynq.c:312 | sysbus_create_varargs | OBJECT(machine) | "ttc[*]" | board init
hw/arm/xilinx_zynq.c:332 | qdev_new | OBJECT(machine) | "sdhci[*]" | board init loop; sysbus_realize
hw/arm/xilinx_zynq.c:341 | qdev_new | OBJECT(dev) | "sd-card" | card owned by its SDHCI controller; qdev_realize
hw/arm/xilinx_zynq.c:347 | qdev_new | OBJECT(machine) | "xadc" | board init; sysbus_realize
hw/arm/xilinx_zynq.c:352 | qdev_new | OBJECT(machine) | "dma" | board init pl330 DMA; sysbus_realize
hw/arm/xilinx_zynq.c:375 | qdev_new | OBJECT(machine) | "devcfg" | board init; sysbus_realize
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/xilinx_zynq.c | 92 ++++++++++++++++++++++++--------------------
1 file changed, 50 insertions(+), 42 deletions(-)
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index ba00c5a3aa..378ab532a3 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -105,22 +105,23 @@ static void zynq_write_board_setup(ARMCPU *cpu,
static struct arm_boot_info zynq_binfo = {};
-static void gem_init(uint32_t base, qemu_irq irq)
+static void gem_init(Object *parent, uint32_t base, qemu_irq irq)
{
DeviceState *dev;
SysBusDevice *s;
- dev = qdev_new_orphan(TYPE_CADENCE_GEM);
+ dev = qdev_new(parent, "gem[*]", TYPE_CADENCE_GEM);
qemu_configure_nic_device(dev, true, NULL);
object_property_set_int(OBJECT(dev), "phy-addr", 7, &error_abort);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, base);
sysbus_connect_irq(s, 0, irq);
}
-static inline int zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
- bool is_qspi, int unit0)
+static inline int zynq_init_spi_flashes(Object *parent, uint32_t base_addr,
+ qemu_irq irq, bool is_qspi,
+ int unit0)
{
int unit = unit0;
DeviceState *dev;
@@ -131,12 +132,13 @@ static inline int zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
int num_busses = is_qspi ? NUM_QSPI_BUSSES : 1;
int num_ss = is_qspi ? NUM_QSPI_FLASHES : NUM_SPI_FLASHES;
- dev = qdev_new_orphan(is_qspi ? "xlnx.ps7-qspi" : "xlnx.ps7-spi");
+ dev = qdev_new(parent, is_qspi ? "qspi" : "spi[*]",
+ is_qspi ? "xlnx.ps7-qspi" : "xlnx.ps7-spi");
qdev_prop_set_uint8(dev, "num-txrx-bytes", is_qspi ? 4 : 1);
qdev_prop_set_uint8(dev, "num-ss-bits", num_ss);
qdev_prop_set_uint8(dev, "num-busses", num_busses);
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, base_addr);
if (is_qspi) {
sysbus_mmio_map(busdev, 1, 0xFC000000);
@@ -152,14 +154,14 @@ static inline int zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
for (j = 0; j < num_ss; ++j) {
DriveInfo *dinfo = drive_get(IF_MTD, 0, unit++);
- flash_dev = qdev_new_orphan("n25q128");
+ flash_dev = qdev_new(OBJECT(dev), "flash[*]", "n25q128");
if (dinfo) {
qdev_prop_set_drive_err(flash_dev, "drive",
blk_by_legacy_dinfo(dinfo),
&error_fatal);
}
qdev_prop_set_uint8(flash_dev, "cs", j);
- qdev_realize_and_unref(flash_dev, BUS(spi), &error_fatal);
+ qdev_realize(flash_dev, BUS(spi), &error_fatal);
cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
sysbus_connect_irq(busdev, i * num_ss + j + 1, cs_line);
@@ -190,14 +192,14 @@ static void zynq_set_boot_mode(Object *obj, const char *str,
m->boot_mode = mode;
}
-static void ddr_ctrl_init(uint32_t base)
+static void ddr_ctrl_init(Object *parent, uint32_t base)
{
DeviceState *dev;
SysBusDevice *busdev;
- dev = qdev_new_orphan("zynq.ddr-ctlr");
+ dev = qdev_new(parent, "ddr-ctrl", "zynq.ddr-ctlr");
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, base);
}
@@ -256,20 +258,21 @@ static void zynq_init(MachineState *machine)
clock_set_hz(zynq_machine->ps_clk, PS_CLK_FREQUENCY);
/* Create slcr, keep a pointer to connect clocks */
- slcr = qdev_new_orphan("xilinx-zynq_slcr");
+ slcr = qdev_new(OBJECT(machine), "slcr", "xilinx-zynq_slcr");
qdev_connect_clock_in(slcr, "ps_clk", zynq_machine->ps_clk);
qdev_prop_set_uint8(slcr, "boot-mode", zynq_machine->boot_mode);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(slcr), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(slcr), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(slcr), 0, 0xF8000000);
- dev = qdev_new_orphan(TYPE_A9MPCORE_PRIV);
+ dev = qdev_new(OBJECT(machine), "a9mpcore", TYPE_A9MPCORE_PRIV);
qdev_prop_set_uint32(dev, "num-cpu", smp_cpus);
qdev_prop_set_uint32(dev, "num-irq", GIC_EXT_IRQS + GIC_INTERNAL);
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, MPCORE_PERIPHBASE);
zynq_binfo.gic_cpu_if_addr = MPCORE_PERIPHBASE + 0x100;
- sysbus_create_varargs_orphan("l2x0", MPCORE_PERIPHBASE + 0x2000, NULL);
+ sysbus_create_varargs(OBJECT(machine), "l2x0", "l2x0",
+ MPCORE_PERIPHBASE + 0x2000, NULL);
for (n = 0; n < smp_cpus; n++) {
/* See "hw/intc/arm_gic.h" for the IRQ line association */
DeviceState *cpudev = DEVICE(zynq_machine->cpu[n]);
@@ -283,39 +286,44 @@ static void zynq_init(MachineState *machine)
pic[n] = qdev_get_gpio_in(dev, n);
}
- n = zynq_init_spi_flashes(0xE0006000, pic[58 - GIC_INTERNAL], false, 0);
- n = zynq_init_spi_flashes(0xE0007000, pic[81 - GIC_INTERNAL], false, n);
- n = zynq_init_spi_flashes(0xE000D000, pic[51 - GIC_INTERNAL], true, n);
+ n = zynq_init_spi_flashes(OBJECT(machine), 0xE0006000,
+ pic[58 - GIC_INTERNAL], false, 0);
+ n = zynq_init_spi_flashes(OBJECT(machine), 0xE0007000,
+ pic[81 - GIC_INTERNAL], false, n);
+ n = zynq_init_spi_flashes(OBJECT(machine), 0xE000D000,
+ pic[51 - GIC_INTERNAL], true, n);
- sysbus_create_simple_orphan(TYPE_CHIPIDEA, 0xE0002000, pic[53 - GIC_INTERNAL]);
- sysbus_create_simple_orphan(TYPE_CHIPIDEA, 0xE0003000, pic[76 - GIC_INTERNAL]);
+ sysbus_create_simple(OBJECT(machine), "usb[*]", TYPE_CHIPIDEA,
+ 0xE0002000, pic[53 - GIC_INTERNAL]);
+ sysbus_create_simple(OBJECT(machine), "usb[*]", TYPE_CHIPIDEA,
+ 0xE0003000, pic[76 - GIC_INTERNAL]);
- dev = qdev_new_orphan(TYPE_CADENCE_UART);
+ dev = qdev_new(OBJECT(machine), "uart[*]", TYPE_CADENCE_UART);
busdev = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
qdev_connect_clock_in(dev, "refclk",
qdev_get_clock_out(slcr, "uart0_ref_clk"));
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, 0xE0000000);
sysbus_connect_irq(busdev, 0, pic[59 - GIC_INTERNAL]);
- dev = qdev_new_orphan(TYPE_CADENCE_UART);
+ dev = qdev_new(OBJECT(machine), "uart[*]", TYPE_CADENCE_UART);
busdev = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(1));
qdev_connect_clock_in(dev, "refclk",
qdev_get_clock_out(slcr, "uart1_ref_clk"));
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, 0xE0001000);
sysbus_connect_irq(busdev, 0, pic[82 - GIC_INTERNAL]);
- sysbus_create_varargs_orphan("cadence_ttc", 0xF8001000,
+ sysbus_create_varargs(OBJECT(machine), "ttc[*]", "cadence_ttc", 0xF8001000,
pic[42-GIC_INTERNAL], pic[43-GIC_INTERNAL], pic[44-GIC_INTERNAL], NULL);
- sysbus_create_varargs_orphan("cadence_ttc", 0xF8002000,
+ sysbus_create_varargs(OBJECT(machine), "ttc[*]", "cadence_ttc", 0xF8002000,
pic[69-GIC_INTERNAL], pic[70-GIC_INTERNAL], pic[71-GIC_INTERNAL], NULL);
- ddr_ctrl_init(0xF8006000);
+ ddr_ctrl_init(OBJECT(machine), 0xF8006000);
- gem_init(0xE000B000, pic[54 - GIC_INTERNAL]);
- gem_init(0xE000C000, pic[77 - GIC_INTERNAL]);
+ gem_init(OBJECT(machine), 0xE000B000, pic[54 - GIC_INTERNAL]);
+ gem_init(OBJECT(machine), 0xE000C000, pic[77 - GIC_INTERNAL]);
for (n = 0; n < 2; n++) {
int hci_irq = n ? 79 : 56;
@@ -329,27 +337,27 @@ static void zynq_init(MachineState *machine)
* - SDIO Specification Version 2.0
* - MMC Specification Version 3.31
*/
- dev = qdev_new_orphan(TYPE_SYSBUS_SDHCI);
+ dev = qdev_new(OBJECT(machine), "sdhci[*]", TYPE_SYSBUS_SDHCI);
qdev_prop_set_uint8(dev, "sd-spec-version", 2);
qdev_prop_set_uint64(dev, "capareg", ZYNQ_SDHCI_CAPABILITIES);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, hci_addr);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[hci_irq - GIC_INTERNAL]);
di = drive_get(IF_SD, 0, n);
blk = di ? blk_by_legacy_dinfo(di) : NULL;
- carddev = qdev_new_orphan(TYPE_SD_CARD);
+ carddev = qdev_new(OBJECT(dev), "sd-card", TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev, qdev_get_child_bus(dev, "sd-bus"),
- &error_fatal);
+ qdev_realize(carddev, qdev_get_child_bus(dev, "sd-bus"),
+ &error_fatal);
}
- dev = qdev_new_orphan(TYPE_ZYNQ_XADC);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(machine), "xadc", TYPE_ZYNQ_XADC);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0xF8007100);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[39-GIC_INTERNAL]);
- dev = qdev_new_orphan("pl330");
+ dev = qdev_new(OBJECT(machine), "dma", "pl330");
object_property_set_link(OBJECT(dev), "memory",
OBJECT(address_space_mem),
&error_fatal);
@@ -365,16 +373,16 @@ static void zynq_init(MachineState *machine)
qdev_prop_set_uint16(dev, "data_buffer_dep", 256);
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, 0xF8003000);
sysbus_connect_irq(busdev, 0, pic[45-GIC_INTERNAL]); /* abort irq line */
for (n = 0; n < ARRAY_SIZE(dma_irqs); ++n) { /* event irqs */
sysbus_connect_irq(busdev, n + 1, pic[dma_irqs[n] - GIC_INTERNAL]);
}
- dev = qdev_new_orphan("xlnx.ps7-dev-cfg");
+ dev = qdev_new(OBJECT(machine), "devcfg", "xlnx.ps7-dev-cfg");
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_connect_irq(busdev, 0, pic[40 - GIC_INTERNAL]);
sysbus_mmio_map(busdev, 0, 0xF8007000);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 059/134] hw/arm/xlnx-versal, xlnx-zynqmp: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (57 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 058/134] hw/arm/xilinx-zynq: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 060/134] hw/arm/realview, integratorcp: " Alexander Graf
` (75 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm xlnx-versal, xlnx-zynqmp
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/xlnx-versal.c:517 | qdev_new | container | name | SoC realize helper; collapse existing add_child(container,name); drop _and_unref
hw/arm/xlnx-versal.c:565 | qdev_new | container | name | SoC realize helper; collapse existing add_child(container,name); drop _and_unref
hw/arm/xlnx-versal.c:667 | qdev_new | parent | name | helper already receives parent+name; collapse add_child; drop _and_unref
hw/arm/xlnx-versal.c:716 | qdev_new | OBJECT(gic) | "its" | collapse existing add_child(gic,"its"); sysbus_realize
hw/arm/xlnx-versal.c:758 | qdev_new | OBJECT(s) | name | SoC realize; hoist name printf, collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:762 | qdev_new | OBJECT(s) | name | SoC realize; hoist name printf, collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:912 | qdev_new | OBJECT(qemu_cluster) | name | hoist name printf; collapse add_child; qdev_realize
hw/arm/xlnx-versal.c:963 | qdev_new | OBJECT(s) | name | hoist name printf; collapse add_child; qdev_realize
hw/arm/xlnx-versal.c:1031 | qdev_new | OBJECT(s) | "uart[*]" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1070 | qdev_new | OBJECT(s) | "canfd[*]" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1110 | qdev_new | OBJECT(s) | "usb[*]" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1170 | qdev_new | OBJECT(s) | "gem[*]" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1254 | qdev_new | OBJECT(s) | name | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1289 | qdev_new | OBJECT(s) | "sdhci[*]" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1323 | qdev_new | OBJECT(s) | "rtc" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1352 | qdev_new | OBJECT(s) | "trng" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1373 | qdev_new | OBJECT(s) | "xram[*]" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1395 | qdev_new | OBJECT(s) | "bbram" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1418 | qdev_new | OBJECT(s) | "efuse-ctrl" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1419 | qdev_new | OBJECT(s) | "efuse-cache" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1420 | qdev_new | OBJECT(s) | "efuse" | collapse add_child; qdev_realize
hw/arm/xlnx-versal.c:1454 | qdev_new | OBJECT(s) | "pmc-iou-slcr" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1476 | qdev_new | OBJECT(s) | "ospi" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1485 | qdev_new | OBJECT(dev) | "dma-dst-dev" | collapse add_child under ospi; sysbus_realize
hw/arm/xlnx-versal.c:1497 | qdev_new | OBJECT(dev) | "dma-src-dev" | collapse add_child under ospi; sysbus_realize
hw/arm/xlnx-versal.c:1551 | qdev_new | container | "cfu-fdro" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1560 | qdev_new | container | "cframe-bcast" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1564 | qdev_new | container | "cfu-apb" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1568 | qdev_new | container | "cframe-irq-or-gate" | collapse add_child; qdev_realize
hw/arm/xlnx-versal.c:1583 | qdev_new | container | "cframe[*]" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1635 | qdev_new | container | "cfu-sfr" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1679 | qdev_new | OBJECT(s) | "crl" | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1764 | qdev_new | OBJECT(s) | name | collapse add_child; sysbus_realize
hw/arm/xlnx-versal.c:1975 | qdev_new | OBJECT(sdhci) | "card[*]" | collapse add_child; qdev_realize
hw/arm/xlnx-versal.c:2018 | qdev_new | OBJECT(ospi) | "flash[*]" | flash on OSPI SPI bus; parent under ospi; qdev_realize
hw/arm/xlnx-versal-virt.c:146 | qdev_new | OBJECT(s) | "virtio-mmio[*]" | machine init helper; collapse add_child; sysbus_realize
hw/arm/xlnx-zcu102.c:190 | qdev_new | OBJECT(machine) | "sd-card[*]" | board init; qdev_realize
hw/arm/xlnx-zcu102.c:205 | qdev_new | OBJECT(machine) | "spi-flash[*]" | board init; qdev_realize
hw/arm/xlnx-zcu102.c:229 | qdev_new | OBJECT(machine) | "qspi-flash[*]" | board init; qdev_realize
hw/arm/xlnx-zynqmp.c:368 | qdev_new | OBJECT(s) | info->name | SoC realize; collapse add_child; sysbus_realize
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/xlnx-versal-virt.c | 5 +-
hw/arm/xlnx-versal.c | 197 ++++++++++++++++----------------------
hw/arm/xlnx-zcu102.c | 14 +--
hw/arm/xlnx-zynqmp.c | 6 +-
4 files changed, 98 insertions(+), 124 deletions(-)
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
index 48f6e6d463..88bebf1f87 100644
--- a/hw/arm/xlnx-versal-virt.c
+++ b/hw/arm/xlnx-versal-virt.c
@@ -143,9 +143,8 @@ static void create_virtio_regions(VersalVirt *s)
qemu_irq pic_irq;
pic_irq = versal_get_reserved_irq(&s->soc, i, &dtb_irq);
- dev = qdev_new_orphan("virtio-mmio");
- object_property_add_child(OBJECT(s), "virtio-mmio[*]", OBJECT(dev));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(OBJECT(s), "virtio-mmio[*]", "virtio-mmio");
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic_irq);
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
memory_region_add_subregion(&s->soc.mr_ps, base, mr);
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
index 7cb95a4ff8..bf125d6f32 100644
--- a/hw/arm/xlnx-versal.c
+++ b/hw/arm/xlnx-versal.c
@@ -514,10 +514,9 @@ static qemu_irq versal_get_gic_irq(Versal *s, int irq_idx)
if (split == NULL) {
size_t i;
- split = qdev_new_orphan(TYPE_SPLIT_IRQ);
+ split = qdev_new(container, name, TYPE_SPLIT_IRQ);
qdev_prop_set_uint16(split, "num-lines", s->intc->len);
- object_property_add_child(container, name, OBJECT(split));
- qdev_realize_and_unref(split, NULL, &error_abort);
+ qdev_realize(split, NULL, &error_abort);
for (i = 0; i < s->intc->len; i++) {
DeviceState *gic;
@@ -562,10 +561,9 @@ static qemu_irq versal_get_irq_or_gate_in(Versal *s, int irq_idx,
dev = DEVICE(object_resolve_path_at(container, name));
if (dev == NULL) {
- dev = qdev_new_orphan(TYPE_OR_IRQ);
- object_property_add_child(container, name, OBJECT(dev));
+ dev = qdev_new(container, name, TYPE_OR_IRQ);
qdev_prop_set_uint16(dev, "num-lines", 1 << R_VERSAL_IRQ_OR_IDX_LENGTH);
- qdev_realize_and_unref(dev, NULL, &error_abort);
+ qdev_realize(dev, NULL, &error_abort);
qdev_connect_gpio_out(dev, 0, target_irq);
}
@@ -664,10 +662,9 @@ static inline DeviceState *create_or_gate(Versal *s, Object *parent,
{
DeviceState *or;
- or = qdev_new_orphan(TYPE_OR_IRQ);
+ or = qdev_new(parent, name, TYPE_OR_IRQ);
qdev_prop_set_uint16(or, "num-lines", num_lines);
- object_property_add_child(parent, name, OBJECT(or));
- qdev_realize_and_unref(or, NULL, &error_abort);
+ qdev_realize(or, NULL, &error_abort);
versal_qdev_connect_gpio_out(s, or, 0, irq_idx);
return or;
@@ -713,14 +710,13 @@ static void versal_create_gic_its(Versal *s,
return;
}
- dev = qdev_new_orphan(TYPE_ARM_GICV3_ITS);
+ dev = qdev_new(OBJECT(gic), "its", TYPE_ARM_GICV3_ITS);
sbd = SYS_BUS_DEVICE(dev);
- object_property_add_child(OBJECT(gic), "its", OBJECT(dev));
object_property_set_link(OBJECT(dev), "parent-gicv3", OBJECT(gic),
&error_abort);
- sysbus_realize_and_unref(sbd, &error_abort);
+ sysbus_realize(sbd, &error_abort);
memory_region_add_subregion(mr, map->gic.its,
sysbus_mmio_get_region(sbd, 0));
@@ -753,21 +749,21 @@ static DeviceState *versal_create_gic(Versal *s,
const char gicv3_compat[] = "arm,gic-v3";
const char gicv2_compat[] = "arm,cortex-a15-gic";
+ name = g_strdup_printf("%s-gic[*]", map->name);
+
switch (map->gic.version) {
case 2:
- dev = qdev_new_orphan(gic_class_name());
+ dev = qdev_new(OBJECT(s), name, gic_class_name());
break;
case 3:
- dev = qdev_new_orphan(gicv3_class_name());
+ dev = qdev_new(OBJECT(s), name, gicv3_class_name());
break;
default:
g_assert_not_reached();
}
- name = g_strdup_printf("%s-gic[*]", map->name);
- object_property_add_child(OBJECT(s), name, OBJECT(dev));
sbd = SYS_BUS_DEVICE(dev);
qdev_prop_set_uint32(dev, "revision", map->gic.version);
qdev_prop_set_uint32(dev, "num-cpu", num_cpu);
@@ -787,7 +783,7 @@ static DeviceState *versal_create_gic(Versal *s,
}
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
memory_region_add_subregion(mr, map->gic.dist,
sysbus_mmio_get_region(sbd, 0));
@@ -909,13 +905,13 @@ static DeviceState *versal_create_cpu(Versal *s,
size_t cluster_idx,
size_t core_idx)
{
- DeviceState *cpu = qdev_new_orphan(map->cpu_model);
- ARMCPU *arm_cpu = ARM_CPU(cpu);
- Object *obj = OBJECT(cpu);
+ DeviceState *cpu;
+ ARMCPU *arm_cpu;
+ Object *obj;
uint64_t affinity;
bool start_off;
size_t idx = cluster_idx * map->num_core + core_idx;
- g_autofree char *name;
+ g_autofree char *name = g_strdup_printf("%s[*]", map->name);
g_autofree char *node = NULL;
affinity = map->mp_affinity.base;
@@ -926,14 +922,15 @@ static DeviceState *versal_create_cpu(Versal *s,
|| ((map->start_powered_off == SPO_SECONDARIES)
&& (cluster_idx || core_idx));
- name = g_strdup_printf("%s[*]", map->name);
- object_property_add_child(OBJECT(qemu_cluster), name, obj);
+ cpu = qdev_new(OBJECT(qemu_cluster), name, map->cpu_model);
+ arm_cpu = ARM_CPU(cpu);
+ obj = OBJECT(cpu);
object_property_set_bool(obj, "start-powered-off", start_off,
&error_abort);
qdev_prop_set_uint64(cpu, "mp-affinity", affinity);
qdev_prop_set_int32(cpu, "core-count", map->num_core);
object_property_set_link(obj, "memory", OBJECT(cpu_mr), &error_abort);
- qdev_realize_and_unref(cpu, NULL, &error_fatal);
+ qdev_realize(cpu, NULL, &error_fatal);
if (!map->dtb_expose) {
return cpu;
@@ -955,15 +952,13 @@ static void versal_create_cpu_cluster(Versal *s, const VersalCpuClusterMap *map)
size_t i, j;
DeviceState *cluster;
MemoryRegion *mr;
- char *name;
+ g_autofree char *name = g_strdup_printf("%s-cluster", map->name);
g_autofree DeviceState **cpus;
const char compatible[] = "arm,armv8-timer";
bool has_gtimer;
- cluster = qdev_new_orphan(TYPE_CPU_CLUSTER);
- name = g_strdup_printf("%s-cluster", map->name);
- object_property_add_child(OBJECT(s), name, OBJECT(cluster));
- g_free(name);
+ cluster = qdev_new(OBJECT(s), name, TYPE_CPU_CLUSTER);
+
qdev_prop_set_uint32(cluster, "cluster-id", map->qemu_cluster_id);
mr = create_cpu_mr(s, cluster, map);
@@ -989,7 +984,7 @@ static void versal_create_cpu_cluster(Versal *s, const VersalCpuClusterMap *map)
}
}
- qdev_realize_and_unref(cluster, NULL, &error_fatal);
+ qdev_realize(cluster, NULL, &error_fatal);
if (!map->per_cluster_gic) {
versal_create_and_connect_gic(s, map, mr, cpus,
@@ -1028,10 +1023,9 @@ static void versal_create_uart(Versal *s,
const char compatible[] = "arm,pl011\0arm,sbsa-uart";
const char clocknames[] = "uartclk\0apb_pclk";
- dev = qdev_new_orphan(TYPE_PL011);
- object_property_add_child(OBJECT(s), "uart[*]", OBJECT(dev));
+ dev = qdev_new(OBJECT(s), "uart[*]", TYPE_PL011);
qdev_prop_set_chr(dev, "chardev", serial_hd(chardev_idx));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
memory_region_add_subregion(&s->mr_ps, map->addr, mr);
@@ -1067,8 +1061,7 @@ static void versal_create_canfd(Versal *s, const VersalSimplePeriphMap *map,
const char compatible[] = "xlnx,canfd-2.0";
const char clocknames[] = "can_clk\0s_axi_aclk";
- sbd = SYS_BUS_DEVICE(qdev_new_orphan(TYPE_XILINX_CANFD));
- object_property_add_child(OBJECT(s), "canfd[*]", OBJECT(sbd));
+ sbd = SYS_BUS_DEVICE(qdev_new(OBJECT(s), "canfd[*]", TYPE_XILINX_CANFD));
object_property_set_int(OBJECT(sbd), "ext_clk_freq",
25 * 1000 * 1000 , &error_abort);
@@ -1076,7 +1069,7 @@ static void versal_create_canfd(Versal *s, const VersalSimplePeriphMap *map,
object_property_set_link(OBJECT(sbd), "canfdbus", OBJECT(bus),
&error_abort);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
mr = sysbus_mmio_get_region(sbd, 0);
memory_region_add_subregion(&s->mr_ps, map->addr, mr);
@@ -1107,15 +1100,14 @@ static void versal_create_usb(Versal *s,
const char compat_versal_dwc3[] = "xlnx,versal-dwc3";
const char compat_dwc3[] = "snps,dwc3";
- dev = qdev_new_orphan(TYPE_XILINX_VERSAL_USB2);
- object_property_add_child(OBJECT(s), "usb[*]", OBJECT(dev));
+ dev = qdev_new(OBJECT(s), "usb[*]", TYPE_XILINX_VERSAL_USB2);
object_property_set_link(OBJECT(dev), "dma", OBJECT(&s->mr_ps),
&error_abort);
qdev_prop_set_uint32(dev, "intrs", 1);
qdev_prop_set_uint32(dev, "slots", 2);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
memory_region_add_subregion(&s->mr_ps, map->xhci, mr);
@@ -1167,8 +1159,7 @@ static void versal_create_gem(Versal *s,
DeviceState *or;
int i;
- dev = qdev_new_orphan(TYPE_CADENCE_GEM);
- object_property_add_child(OBJECT(s), "gem[*]", OBJECT(dev));
+ dev = qdev_new(OBJECT(s), "gem[*]", TYPE_CADENCE_GEM);
qemu_configure_nic_device(dev, true, NULL);
object_property_set_int(OBJECT(dev), "phy-addr", 23, &error_abort);
@@ -1177,7 +1168,7 @@ static void versal_create_gem(Versal *s,
object_property_set_link(OBJECT(dev), "dma", OBJECT(&s->mr_ps),
&error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
memory_region_add_subregion(&s->mr_ps, map->map.addr, mr);
@@ -1251,12 +1242,11 @@ static void versal_create_zdma(Versal *s,
int irq = map->map.irq + map->irq_stride * i;
g_autofree char *node;
- dev = qdev_new_orphan(TYPE_XLNX_ZDMA);
- object_property_add_child(OBJECT(s), name, OBJECT(dev));
+ dev = qdev_new(OBJECT(s), name, TYPE_XLNX_ZDMA);
object_property_set_int(OBJECT(dev), "bus-width", 128, &error_abort);
object_property_set_link(OBJECT(dev), "dma",
OBJECT(get_system_memory()), &error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
memory_region_add_subregion(&s->mr_ps, addr, mr);
@@ -1286,15 +1276,14 @@ static void versal_create_sdhci(Versal *s,
const char compatible[] = "arasan,sdhci-8.9a";
const char clocknames[] = "clk_xin\0clk_ahb";
- dev = qdev_new_orphan(TYPE_SYSBUS_SDHCI);
- object_property_add_child(OBJECT(s), "sdhci[*]", OBJECT(dev));
+ dev = qdev_new(OBJECT(s), "sdhci[*]", TYPE_SYSBUS_SDHCI);
object_property_set_uint(OBJECT(dev), "sd-spec-version", 3,
&error_fatal);
object_property_set_uint(OBJECT(dev), "capareg", SDHCI_CAPABILITIES,
&error_fatal);
object_property_set_uint(OBJECT(dev), "uhs", UHS_I, &error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
memory_region_add_subregion(&s->mr_ps, map->addr, mr);
@@ -1320,9 +1309,8 @@ static void versal_create_rtc(Versal *s, const struct VersalRtcMap *map)
const char compatible[] = "xlnx,zynqmp-rtc";
const char interrupt_names[] = "alarm\0sec";
- sbd = SYS_BUS_DEVICE(qdev_new_orphan(TYPE_XLNX_ZYNQMP_RTC));
- object_property_add_child(OBJECT(s), "rtc", OBJECT(sbd));
- sysbus_realize_and_unref(sbd, &error_abort);
+ sbd = SYS_BUS_DEVICE(qdev_new(OBJECT(s), "rtc", TYPE_XLNX_ZYNQMP_RTC));
+ sysbus_realize(sbd, &error_abort);
mr = sysbus_mmio_get_region(sbd, 0);
memory_region_add_subregion(&s->mr_ps, map->map.addr, mr);
@@ -1349,9 +1337,8 @@ static void versal_create_trng(Versal *s, const VersalSimplePeriphMap *map)
SysBusDevice *sbd;
MemoryRegion *mr;
- sbd = SYS_BUS_DEVICE(qdev_new_orphan(TYPE_XLNX_VERSAL_TRNG));
- object_property_add_child(OBJECT(s), "trng", OBJECT(sbd));
- sysbus_realize_and_unref(sbd, &error_abort);
+ sbd = SYS_BUS_DEVICE(qdev_new(OBJECT(s), "trng", TYPE_XLNX_VERSAL_TRNG));
+ sysbus_realize(sbd, &error_abort);
mr = sysbus_mmio_get_region(sbd, 0);
memory_region_add_subregion(&s->mr_ps, map->addr, mr);
@@ -1370,9 +1357,9 @@ static void versal_create_xrams(Versal *s, const struct VersalXramMap *map)
for (i = 0; i < map->num; i++) {
hwaddr ctrl, mem;
- sbd = SYS_BUS_DEVICE(qdev_new_orphan(TYPE_XLNX_XRAM_CTRL));
- object_property_add_child(OBJECT(s), "xram[*]", OBJECT(sbd));
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sbd = SYS_BUS_DEVICE(qdev_new(OBJECT(s), "xram[*]",
+ TYPE_XLNX_XRAM_CTRL));
+ sysbus_realize(sbd, &error_fatal);
ctrl = map->ctrl + map->ctrl_stride * i;
mem = map->mem + map->mem_stride * i;
@@ -1392,12 +1379,11 @@ static void versal_create_bbram(Versal *s,
DeviceState *dev;
SysBusDevice *sbd;
- dev = qdev_new_orphan(TYPE_XLNX_BBRAM);
+ dev = qdev_new(OBJECT(s), "bbram", TYPE_XLNX_BBRAM);
sbd = SYS_BUS_DEVICE(dev);
- object_property_add_child(OBJECT(s), "bbram", OBJECT(dev));
qdev_prop_set_uint32(dev, "crc-zpads", 0);
- sysbus_realize_and_unref(sbd, &error_abort);
+ sysbus_realize(sbd, &error_abort);
memory_region_add_subregion(&s->mr_ps, map->addr,
sysbus_mmio_get_region(sbd, 0));
versal_sysbus_connect_irq(s, sbd, 0, map->irq);
@@ -1415,26 +1401,24 @@ static void versal_create_efuse(Versal *s,
return;
}
- ctrl = qdev_new_orphan(TYPE_XLNX_VERSAL_EFUSE_CTRL);
- cache = qdev_new_orphan(TYPE_XLNX_VERSAL_EFUSE_CACHE);
- bits = qdev_new_orphan(TYPE_XLNX_EFUSE);
+ ctrl = qdev_new(OBJECT(s), "efuse-ctrl", TYPE_XLNX_VERSAL_EFUSE_CTRL);
+ cache = qdev_new(OBJECT(s), "efuse-cache",
+ TYPE_XLNX_VERSAL_EFUSE_CACHE);
+ bits = qdev_new(OBJECT(s), "efuse", TYPE_XLNX_EFUSE);
qdev_prop_set_uint32(bits, "efuse-nr", 3);
qdev_prop_set_uint32(bits, "efuse-size", 8192);
- object_property_add_child(OBJECT(s), "efuse", OBJECT(bits));
- qdev_realize_and_unref(bits, NULL, &error_abort);
+ qdev_realize(bits, NULL, &error_abort);
object_property_set_link(OBJECT(ctrl), "efuse", OBJECT(bits), &error_abort);
object_property_set_link(OBJECT(cache), "efuse", OBJECT(bits),
&error_abort);
- object_property_add_child(OBJECT(s), "efuse-cache", OBJECT(cache));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(cache), &error_abort);
+ sysbus_realize(SYS_BUS_DEVICE(cache), &error_abort);
- object_property_add_child(OBJECT(s), "efuse-ctrl", OBJECT(ctrl));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(ctrl), &error_abort);
+ sysbus_realize(SYS_BUS_DEVICE(ctrl), &error_abort);
memory_region_add_subregion(&s->mr_ps, map->ctrl,
sysbus_mmio_get_region(SYS_BUS_DEVICE(ctrl),
@@ -1451,11 +1435,11 @@ static DeviceState *versal_create_pmc_iou_slcr(Versal *s,
SysBusDevice *sbd;
DeviceState *dev;
- dev = qdev_new_orphan(TYPE_XILINX_VERSAL_PMC_IOU_SLCR);
- object_property_add_child(OBJECT(s), "pmc-iou-slcr", OBJECT(dev));
+ dev = qdev_new(OBJECT(s), "pmc-iou-slcr",
+ TYPE_XILINX_VERSAL_PMC_IOU_SLCR);
sbd = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
memory_region_add_subregion(&s->mr_ps, map->addr,
sysbus_mmio_get_region(sbd, 0));
@@ -1473,8 +1457,7 @@ static DeviceState *versal_create_ospi(Versal *s,
DeviceState *dev, *dma_dst, *dma_src, *orgate;
MemoryRegion *linear_mr = g_new(MemoryRegion, 1);
- dev = qdev_new_orphan(TYPE_XILINX_VERSAL_OSPI);
- object_property_add_child(OBJECT(s), "ospi", OBJECT(dev));
+ dev = qdev_new(OBJECT(s), "ospi", TYPE_XILINX_VERSAL_OSPI);
memory_region_init(linear_mr, OBJECT(dev), "linear-mr", map->dac_sz);
@@ -1482,20 +1465,18 @@ static DeviceState *versal_create_ospi(Versal *s,
memory_region_add_subregion(linear_mr, 0x0, mr_dac);
/* Create the OSPI destination DMA */
- dma_dst = qdev_new_orphan(TYPE_XLNX_CSU_DMA);
- object_property_add_child(OBJECT(dev), "dma-dst-dev", OBJECT(dma_dst));
+ dma_dst = qdev_new(OBJECT(dev), "dma-dst-dev", TYPE_XLNX_CSU_DMA);
object_property_set_link(OBJECT(dma_dst), "dma",
OBJECT(get_system_memory()), &error_abort);
sbd = SYS_BUS_DEVICE(dma_dst);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
memory_region_add_subregion(&s->mr_ps, map->dma_dst,
sysbus_mmio_get_region(sbd, 0));
/* Create the OSPI source DMA */
- dma_src = qdev_new_orphan(TYPE_XLNX_CSU_DMA);
- object_property_add_child(OBJECT(dev), "dma-src-dev", OBJECT(dma_src));
+ dma_src = qdev_new(OBJECT(dev), "dma-src-dev", TYPE_XLNX_CSU_DMA);
object_property_set_bool(OBJECT(dma_src), "is-dst", false, &error_abort);
@@ -1506,7 +1487,7 @@ static DeviceState *versal_create_ospi(Versal *s,
OBJECT(dma_dst), &error_abort);
sbd = SYS_BUS_DEVICE(dma_src);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
memory_region_add_subregion(&s->mr_ps, map->dma_src,
sysbus_mmio_get_region(sbd, 0));
@@ -1516,7 +1497,7 @@ static DeviceState *versal_create_ospi(Versal *s,
OBJECT(dma_src), &error_abort);
sbd = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
memory_region_add_subregion(&s->mr_ps, map->ctrl,
sysbus_mmio_get_region(sbd, 0));
@@ -1548,28 +1529,24 @@ static void versal_create_cfu(Versal *s, const struct VersalCfuMap *map)
object_unref(container);
/* CFU FDRO */
- cfu_fdro = qdev_new_orphan(TYPE_XLNX_VERSAL_CFU_FDRO);
- object_property_add_child(container, "cfu-fdro", OBJECT(cfu_fdro));
+ cfu_fdro = qdev_new(container, "cfu-fdro", TYPE_XLNX_VERSAL_CFU_FDRO);
sbd = SYS_BUS_DEVICE(cfu_fdro);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
memory_region_add_subregion(&s->mr_ps, map->cfu_fdro,
sysbus_mmio_get_region(sbd, 0));
/* cframe bcast */
- cframe_bcast = qdev_new_orphan(TYPE_XLNX_VERSAL_CFRAME_BCAST_REG);
- object_property_add_child(container, "cframe-bcast", OBJECT(cframe_bcast));
+ cframe_bcast = qdev_new(container, "cframe-bcast",
+ TYPE_XLNX_VERSAL_CFRAME_BCAST_REG);
/* CFU APB */
- cfu_apb = qdev_new_orphan(TYPE_XLNX_VERSAL_CFU_APB);
- object_property_add_child(container, "cfu-apb", OBJECT(cfu_apb));
+ cfu_apb = qdev_new(container, "cfu-apb", TYPE_XLNX_VERSAL_CFU_APB);
/* IRQ or gate for cframes */
- cframe_irq_or = qdev_new_orphan(TYPE_OR_IRQ);
- object_property_add_child(container, "cframe-irq-or-gate",
- OBJECT(cframe_irq_or));
+ cframe_irq_or = qdev_new(container, "cframe-irq-or-gate", TYPE_OR_IRQ);
qdev_prop_set_uint16(cframe_irq_or, "num-lines", map->num_cframe);
- qdev_realize_and_unref(cframe_irq_or, NULL, &error_abort);
+ qdev_realize(cframe_irq_or, NULL, &error_abort);
versal_qdev_connect_gpio_out(s, cframe_irq_or, 0, map->cframe_irq);
/* cframe reg */
@@ -1580,8 +1557,8 @@ static void versal_create_cfu(Versal *s, const struct VersalCfuMap *map)
g_autofree char *prop_name;
size_t j;
- dev = qdev_new_orphan(TYPE_XLNX_VERSAL_CFRAME_REG);
- object_property_add_child(container, "cframe[*]", OBJECT(dev));
+ dev = qdev_new(container, "cframe[*]",
+ TYPE_XLNX_VERSAL_CFRAME_REG);
sbd = SYS_BUS_DEVICE(dev);
@@ -1597,7 +1574,7 @@ static void versal_create_cfu(Versal *s, const struct VersalCfuMap *map)
object_property_set_link(OBJECT(dev), "cfu-fdro",
OBJECT(cfu_fdro), &error_abort);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_abort);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_abort);
reg_base = map->cframe_base + i * map->cframe_stride * 2;
fdri_base = reg_base + map->cframe_stride;
@@ -1615,14 +1592,14 @@ static void versal_create_cfu(Versal *s, const struct VersalCfuMap *map)
}
sbd = SYS_BUS_DEVICE(cframe_bcast);
- sysbus_realize_and_unref(sbd, &error_abort);
+ sysbus_realize(sbd, &error_abort);
memory_region_add_subregion(&s->mr_ps, map->cframe_bcast_reg,
sysbus_mmio_get_region(sbd, 0));
memory_region_add_subregion(&s->mr_ps, map->cframe_bcast_fdri,
sysbus_mmio_get_region(sbd, 1));
sbd = SYS_BUS_DEVICE(cfu_apb);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
memory_region_add_subregion(&s->mr_ps, map->cfu_apb,
sysbus_mmio_get_region(sbd, 0));
memory_region_add_subregion(&s->mr_ps, map->cfu_stream,
@@ -1632,13 +1609,12 @@ static void versal_create_cfu(Versal *s, const struct VersalCfuMap *map)
versal_sysbus_connect_irq(s, sbd, 0, map->cfu_apb_irq);
/* CFU SFR */
- cfu_sfr = qdev_new_orphan(TYPE_XLNX_VERSAL_CFU_SFR);
- object_property_add_child(container, "cfu-sfr", OBJECT(cfu_sfr));
+ cfu_sfr = qdev_new(container, "cfu-sfr", TYPE_XLNX_VERSAL_CFU_SFR);
sbd = SYS_BUS_DEVICE(cfu_sfr);
object_property_set_link(OBJECT(cfu_sfr),
"cfu", OBJECT(cfu_apb), &error_abort);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
memory_region_add_subregion(&s->mr_ps, map->cfu_sfr,
sysbus_mmio_get_region(sbd, 0));
}
@@ -1676,9 +1652,8 @@ static inline void versal_create_crl(Versal *s)
ver = versal_get_version(s);
crl_class = xlnx_versal_crl_class_name(ver);
- dev = qdev_new_orphan(crl_class);
+ dev = qdev_new(OBJECT(s), "crl", crl_class);
obj = OBJECT(dev);
- object_property_add_child(OBJECT(s), "crl", obj);
/*
* The 3rd GEM controller on versal2 is in the MMI subsystem.
@@ -1694,7 +1669,7 @@ static inline void versal_create_crl(Versal *s)
crl_connect_dev_by_name(s, obj, "gem", num_gem);
crl_connect_dev_by_name(s, obj, "usb", map->num_usb);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_abort);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_abort);
memory_region_add_subregion(&s->mr_ps, map->crl.addr,
sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0));
@@ -1761,13 +1736,12 @@ static void versal_unimp_area(Versal *s, const char *name,
MemoryRegion *mr,
hwaddr base, hwaddr size)
{
- DeviceState *dev = qdev_new_orphan(TYPE_UNIMPLEMENTED_DEVICE);
+ DeviceState *dev = qdev_new(OBJECT(s), name, TYPE_UNIMPLEMENTED_DEVICE);
MemoryRegion *mr_dev;
qdev_prop_set_string(dev, "name", name);
qdev_prop_set_uint64(dev, "size", size);
- object_property_add_child(OBJECT(s), name, OBJECT(dev));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
mr_dev = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
memory_region_add_subregion(mr, base, mr_dev);
@@ -1972,11 +1946,10 @@ void versal_sdhci_plug_card(Versal *s, int sd_idx, BlockBackend *blk)
return;
}
- card = qdev_new_orphan(TYPE_SD_CARD);
- object_property_add_child(OBJECT(sdhci), "card[*]", OBJECT(card));
+ card = qdev_new(OBJECT(sdhci), "card[*]", TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk, &error_fatal);
- qdev_realize_and_unref(card, qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
- &error_fatal);
+ qdev_realize(card, qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
+ &error_fatal);
}
void versal_efuse_attach_drive(Versal *s, BlockBackend *blk)
@@ -2015,13 +1988,13 @@ void versal_ospi_create_flash(Versal *s, int flash_idx, const char *flash_mdl,
ospi = DEVICE(versal_get_child(s, "ospi"));
spi_bus = qdev_get_child_bus(ospi, "spi0");
- flash = qdev_new_orphan(flash_mdl);
+ flash = qdev_new(OBJECT(ospi), "flash[*]", flash_mdl);
if (blk) {
qdev_prop_set_drive_err(flash, "drive", blk, &error_fatal);
}
qdev_prop_set_uint8(flash, "cs", flash_idx);
- qdev_realize_and_unref(flash, spi_bus, &error_fatal);
+ qdev_realize(flash, spi_bus, &error_fatal);
cs_line = qdev_get_gpio_in_named(flash, SSI_GPIO_CS, 0);
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
index adff52eaf6..473acad060 100644
--- a/hw/arm/xlnx-zcu102.c
+++ b/hw/arm/xlnx-zcu102.c
@@ -187,9 +187,9 @@ static void xlnx_zcu102_init(MachineState *machine)
error_report("No SD bus found for SD card %d", i);
exit(1);
}
- carddev = qdev_new_orphan(TYPE_SD_CARD);
+ carddev = qdev_new(OBJECT(machine), "sd-card[*]", TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev, bus, &error_fatal);
+ qdev_realize(carddev, bus, &error_fatal);
}
for (i = 0; i < XLNX_ZYNQMP_NUM_SPIS; i++) {
@@ -202,13 +202,14 @@ static void xlnx_zcu102_init(MachineState *machine)
spi_bus = qdev_get_child_bus(DEVICE(&s->soc), bus_name);
g_free(bus_name);
- flash_dev = qdev_new_orphan("sst25wf080");
+ flash_dev = qdev_new(OBJECT(machine), "spi-flash[*]",
+ "sst25wf080");
if (dinfo) {
qdev_prop_set_drive_err(flash_dev, "drive",
blk_by_legacy_dinfo(dinfo), &error_fatal);
}
qdev_prop_set_uint8(flash_dev, "cs", i);
- qdev_realize_and_unref(flash_dev, spi_bus, &error_fatal);
+ qdev_realize(flash_dev, spi_bus, &error_fatal);
cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
@@ -226,13 +227,14 @@ static void xlnx_zcu102_init(MachineState *machine)
spi_bus = qdev_get_child_bus(DEVICE(&s->soc), bus_name);
g_free(bus_name);
- flash_dev = qdev_new_orphan("n25q512a11");
+ flash_dev = qdev_new(OBJECT(machine), "qspi-flash[*]",
+ "n25q512a11");
if (dinfo) {
qdev_prop_set_drive_err(flash_dev, "drive",
blk_by_legacy_dinfo(dinfo), &error_fatal);
}
qdev_prop_set_uint8(flash_dev, "cs", i);
- qdev_realize_and_unref(flash_dev, spi_bus, &error_fatal);
+ qdev_realize(flash_dev, spi_bus, &error_fatal);
cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index 861ee35839..e4a10861a8 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -365,15 +365,15 @@ static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
for (nr = 0; nr < ARRAY_SIZE(unimp_areas); nr++) {
const struct UnimpInfo *info = &unimp_areas[nr];
- DeviceState *dev = qdev_new_orphan(TYPE_UNIMPLEMENTED_DEVICE);
+ DeviceState *dev = qdev_new(OBJECT(s), info->name,
+ TYPE_UNIMPLEMENTED_DEVICE);
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
assert(info->name && info->base && info->size > 0);
qdev_prop_set_string(dev, "name", info->name);
qdev_prop_set_uint64(dev, "size", info->size);
- object_property_add_child(OBJECT(s), info->name, OBJECT(dev));
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
sysbus_mmio_map(sbd, 0, info->base);
}
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 060/134] hw/arm/realview, integratorcp: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (58 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 059/134] hw/arm/xlnx-versal, xlnx-zynqmp: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 061/134] hw/arm/npcm: " Alexander Graf
` (74 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm realview, integratorcp
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/integratorcp.c:624 | qdev_new | OBJECT(machine) | "core" | board init; single core module
hw/arm/integratorcp.c:629 | sysbus_create_varargs | OBJECT(machine) | "pic" | board init; primary PIC
hw/arm/integratorcp.c:636 | sysbus_create_simple | OBJECT(machine) | "sic" | board init; secondary PIC
hw/arm/integratorcp.c:637 | sysbus_create_varargs | OBJECT(machine) | "pit" | board init; single PIT
hw/arm/integratorcp.c:639 | sysbus_create_simple | OBJECT(machine) | "rtc" | board init; single pl031 RTC
hw/arm/integratorcp.c:642 | sysbus_create_simple | OBJECT(machine) | "icp" | board init; ICP control regs
hw/arm/integratorcp.c:644 | sysbus_create_simple | OBJECT(machine) | "keyboard" | board init; pl050 KMI0
hw/arm/integratorcp.c:645 | sysbus_create_simple | OBJECT(machine) | "mouse" | board init; pl050 KMI1
hw/arm/integratorcp.c:646 | sysbus_create_simple | OBJECT(machine) | "debug" | board init; single debug LEDs
hw/arm/integratorcp.c:648 | sysbus_create_varargs | OBJECT(machine) | "mmc" | board init; single pl181 MMC
hw/arm/integratorcp.c:657 | qdev_new | OBJECT(machine) | "sd-card" | board init; single SD card
hw/arm/integratorcp.c:664 | qdev_new | OBJECT(machine) | "aaci" | board init; single pl041 audio
hw/arm/integratorcp.c:676 | qdev_new | OBJECT(machine) | "clcd" | board init; single pl110 CLCD
hw/arm/realview.c:64 | qdev_new | parent | "split-irq[*]" | helper: threaded Object *parent from board init; called twice → auto-index
hw/arm/realview.c:183 | qdev_new | OBJECT(machine) | "sysctl" | board init; single sysctl
hw/arm/realview.c:191 | qdev_new | OBJECT(machine) | "mpcore" | board init; A9 mpcore (excl. w/ 194,209)
hw/arm/realview.c:194 | qdev_new | OBJECT(machine) | "mpcore" | board init; 11MP mpcore (excl. w/ 191,209)
hw/arm/realview.c:203 | sysbus_create_varargs | OBJECT(machine) | "l2x0" | board init; single L2 cache ctlr
hw/arm/realview.c:209 | sysbus_create_simple | OBJECT(machine) | "gic" | board init; single GIC (excl. w/ 191,194)
hw/arm/realview.c:215 | qdev_new | OBJECT(machine) | "aaci" | board init; single pl041 audio
hw/arm/realview.c:224 | sysbus_create_simple | OBJECT(machine) | "keyboard" | board init; pl050 KMI0
hw/arm/realview.c:225 | sysbus_create_simple | OBJECT(machine) | "mouse" | board init; pl050 KMI1
hw/arm/realview.c:233 | qdev_new | OBJECT(machine) | "dma" | board init; single pl081 DMA
hw/arm/realview.c:241 | sysbus_create_simple | OBJECT(machine) | "timer[*]" | board init; 2× sp804 → auto-index
hw/arm/realview.c:242 | sysbus_create_simple | OBJECT(machine) | "timer[*]" | board init; 2× sp804 → auto-index
hw/arm/realview.c:244 | sysbus_create_simple | OBJECT(machine) | "gpio[*]" | board init; 3× pl061 → auto-index
hw/arm/realview.c:245 | sysbus_create_simple | OBJECT(machine) | "gpio[*]" | board init; 3× pl061 → auto-index
hw/arm/realview.c:246 | sysbus_create_simple | OBJECT(machine) | "gpio[*]" | board init; 3× pl061 → auto-index
hw/arm/realview.c:248 | qdev_new | OBJECT(machine) | "clcd" | board init; single pl111 CLCD
hw/arm/realview.c:255 | sysbus_create_varargs | OBJECT(machine) | "mmc" | board init; single pl181 MMC
hw/arm/realview.c:274 | qdev_new | OBJECT(machine) | "sd-card" | board init; single SD card
hw/arm/realview.c:281 | sysbus_create_simple | OBJECT(machine) | "rtc" | board init; single pl031 RTC
hw/arm/realview.c:284 | qdev_new | OBJECT(machine) | "pci-host" | board init; single PCI host bridge
hw/arm/realview.c:300 | pci_create_simple | OBJECT(machine) | "ohci" | board init; single OHCI USB
hw/arm/realview.c:304 | pci_create_simple | OBJECT(machine) | "scsi[*]" | board init; loop → auto-index
hw/arm/realview.c:322 | sysbus_create_simple | OBJECT(machine) | "i2c" | board init; single SBCon I2C
hw/arm/realview.c:324 | i2c_slave_create_simple | OBJECT(machine) | "ds1338" | board init; single DS1338 RTC
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/integratorcp.c | 45 ++++++++++++----------
hw/arm/realview.c | 87 +++++++++++++++++++++++++------------------
2 files changed, 76 insertions(+), 56 deletions(-)
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 7560ad5983..ed715a3eb8 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -621,31 +621,38 @@ static void integratorcp_init(MachineState *machine)
0, ram_size);
memory_region_add_subregion(address_space_mem, 0x80000000, ram_alias);
- dev = qdev_new_orphan(TYPE_INTEGRATOR_CM);
+ dev = qdev_new(OBJECT(machine), "core", TYPE_INTEGRATOR_CM);
qdev_prop_set_uint32(dev, "memsz", ram_size >> 20);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map((SysBusDevice *)dev, 0, 0x10000000);
- dev = sysbus_create_varargs_orphan(TYPE_INTEGRATOR_PIC, 0x14000000,
+ dev = sysbus_create_varargs(OBJECT(machine), "pic",
+ TYPE_INTEGRATOR_PIC, 0x14000000,
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ),
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_FIQ),
NULL);
for (i = 0; i < 32; i++) {
pic[i] = qdev_get_gpio_in(dev, i);
}
- sic = sysbus_create_simple_orphan(TYPE_INTEGRATOR_PIC, 0xca000000, pic[26]);
- sysbus_create_varargs_orphan("integrator_pit", 0x13000000,
+ sic = sysbus_create_simple(OBJECT(machine), "sic",
+ TYPE_INTEGRATOR_PIC, 0xca000000, pic[26]);
+ sysbus_create_varargs(OBJECT(machine), "pit", "integrator_pit", 0x13000000,
pic[5], pic[6], pic[7], NULL);
- sysbus_create_simple_orphan("pl031", 0x15000000, pic[8]);
+ sysbus_create_simple(OBJECT(machine), "rtc", "pl031", 0x15000000, pic[8]);
pl011_create(OBJECT(machine), 0x16000000, pic[1], serial_hd(0));
pl011_create(OBJECT(machine), 0x17000000, pic[2], serial_hd(1));
- icp = sysbus_create_simple_orphan(TYPE_ICP_CONTROL_REGS, 0xcb000000,
+ icp = sysbus_create_simple(OBJECT(machine), "icp",
+ TYPE_ICP_CONTROL_REGS, 0xcb000000,
qdev_get_gpio_in(sic, 3));
- sysbus_create_simple_orphan("pl050_keyboard", 0x18000000, pic[3]);
- sysbus_create_simple_orphan("pl050_mouse", 0x19000000, pic[4]);
- sysbus_create_simple_orphan(TYPE_INTEGRATOR_DEBUG, 0x1a000000, 0);
-
- dev = sysbus_create_varargs_orphan("pl181", 0x1c000000, pic[23], pic[24], NULL);
+ sysbus_create_simple(OBJECT(machine), "keyboard",
+ "pl050_keyboard", 0x18000000, pic[3]);
+ sysbus_create_simple(OBJECT(machine), "mouse",
+ "pl050_mouse", 0x19000000, pic[4]);
+ sysbus_create_simple(OBJECT(machine), "debug",
+ TYPE_INTEGRATOR_DEBUG, 0x1a000000, 0);
+
+ dev = sysbus_create_varargs(OBJECT(machine), "mmc", "pl181",
+ 0x1c000000, pic[23], pic[24], NULL);
qdev_connect_gpio_out_named(dev, "card-read-only", 0,
qdev_get_gpio_in_named(icp, ICP_GPIO_MMC_WPROT, 0));
qdev_connect_gpio_out_named(dev, "card-inserted", 0,
@@ -654,18 +661,18 @@ static void integratorcp_init(MachineState *machine)
if (dinfo) {
DeviceState *card;
- card = qdev_new_orphan(TYPE_SD_CARD);
+ card = qdev_new(OBJECT(machine), "sd-card", TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
- qdev_realize_and_unref(card, qdev_get_child_bus(dev, "sd-bus"),
- &error_fatal);
+ qdev_realize(card, qdev_get_child_bus(dev, "sd-bus"),
+ &error_fatal);
}
- dev = qdev_new_orphan("pl041");
+ dev = qdev_new(OBJECT(machine), "aaci", "pl041");
if (machine->audiodev) {
qdev_prop_set_string(dev, "audiodev", machine->audiodev);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x1d000000);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[25]);
@@ -673,10 +680,10 @@ static void integratorcp_init(MachineState *machine)
smc91c111_init(OBJECT(machine), 0xc8000000, pic[27]);
}
- dev = qdev_new_orphan("pl110");
+ dev = qdev_new(OBJECT(machine), "clcd", "pl110");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
OBJECT(address_space_mem), &error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0xc0000000);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[22]);
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index 965fef4fcf..2441137222 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -59,13 +59,14 @@ static const int realview_board_id[] = {
0x76d
};
-static void split_irq_from_named(DeviceState *src, const char* outname,
- qemu_irq out1, qemu_irq out2) {
- DeviceState *splitter = qdev_new_orphan(TYPE_SPLIT_IRQ);
+static void split_irq_from_named(Object *parent, DeviceState *src,
+ const char *outname,
+ qemu_irq out1, qemu_irq out2) {
+ DeviceState *splitter = qdev_new(parent, "split-irq[*]", TYPE_SPLIT_IRQ);
qdev_prop_set_uint32(splitter, "num-lines", 2);
- qdev_realize_and_unref(splitter, NULL, &error_fatal);
+ qdev_realize(splitter, NULL, &error_fatal);
qdev_connect_gpio_out(splitter, 0, out1);
qdev_connect_gpio_out(splitter, 1, out2);
@@ -180,49 +181,53 @@ static void realview_init(MachineState *machine,
}
sys_id = is_pb ? 0x01780500 : 0xc1400400;
- sysctl = qdev_new_orphan("realview_sysctl");
+ sysctl = qdev_new(OBJECT(machine), "sysctl", "realview_sysctl");
qdev_prop_set_uint32(sysctl, "sys_id", sys_id);
qdev_prop_set_uint32(sysctl, "proc_id", proc_id);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(sysctl), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(sysctl), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(sysctl), 0, 0x10000000);
if (is_mpcore) {
if (is_pb) {
- dev = qdev_new_orphan(TYPE_A9MPCORE_PRIV);
+ dev = qdev_new(OBJECT(machine), "mpcore", TYPE_A9MPCORE_PRIV);
qdev_prop_set_uint32(dev, "num-irq", GIC_EXT_IRQS + GIC_INTERNAL);
} else {
- dev = qdev_new_orphan("realview_mpcore");
+ dev = qdev_new(OBJECT(machine), "mpcore", "realview_mpcore");
}
qdev_prop_set_uint32(dev, "num-cpu", smp_cpus);
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, periphbase);
for (n = 0; n < smp_cpus; n++) {
sysbus_connect_irq(busdev, n, cpu_irq[n]);
}
- sysbus_create_varargs_orphan("l2x0", periphbase + 0x2000, NULL);
+ sysbus_create_varargs(OBJECT(machine), "l2x0", "l2x0",
+ periphbase + 0x2000, NULL);
/* Both A9 and 11MPCore put the GIC CPU i/f at base + 0x100 */
realview_binfo.gic_cpu_if_addr = periphbase + 0x100;
} else {
uint32_t gic_addr = is_pb ? 0x1e000000 : 0x10040000;
/* For now just create the nIRQ GIC, and ignore the others. */
- dev = sysbus_create_simple_orphan(TYPE_REALVIEW_GIC, gic_addr, cpu_irq[0]);
+ dev = sysbus_create_simple(OBJECT(machine), "gic",
+ TYPE_REALVIEW_GIC, gic_addr, cpu_irq[0]);
}
for (n = 0; n < GIC_EXT_IRQS; n++) {
pic[n] = qdev_get_gpio_in(dev, n);
}
- pl041 = qdev_new_orphan("pl041");
+ pl041 = qdev_new(OBJECT(machine), "aaci", "pl041");
qdev_prop_set_uint32(pl041, "nc_fifo_depth", 512);
if (machine->audiodev) {
qdev_prop_set_string(pl041, "audiodev", machine->audiodev);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(pl041), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(pl041), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(pl041), 0, 0x10004000);
sysbus_connect_irq(SYS_BUS_DEVICE(pl041), 0, pic[19]);
- sysbus_create_simple_orphan("pl050_keyboard", 0x10006000, pic[20]);
- sysbus_create_simple_orphan("pl050_mouse", 0x10007000, pic[21]);
+ sysbus_create_simple(OBJECT(machine), "keyboard",
+ "pl050_keyboard", 0x10006000, pic[20]);
+ sysbus_create_simple(OBJECT(machine), "mouse",
+ "pl050_mouse", 0x10007000, pic[21]);
pl011_create(OBJECT(machine), 0x10009000, pic[12], serial_hd(0));
pl011_create(OBJECT(machine), 0x1000a000, pic[13], serial_hd(1));
@@ -230,40 +235,46 @@ static void realview_init(MachineState *machine,
pl011_create(OBJECT(machine), 0x1000c000, pic[15], serial_hd(3));
/* DMA controller is optional, apparently. */
- dev = qdev_new_orphan("pl081");
+ dev = qdev_new(OBJECT(machine), "dma", "pl081");
object_property_set_link(OBJECT(dev), "downstream", OBJECT(sysmem),
&error_fatal);
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, 0x10030000);
sysbus_connect_irq(busdev, 0, pic[24]);
- sysbus_create_simple_orphan("sp804", 0x10011000, pic[4]);
- sysbus_create_simple_orphan("sp804", 0x10012000, pic[5]);
+ sysbus_create_simple(OBJECT(machine), "timer[*]",
+ "sp804", 0x10011000, pic[4]);
+ sysbus_create_simple(OBJECT(machine), "timer[*]",
+ "sp804", 0x10012000, pic[5]);
- sysbus_create_simple_orphan("pl061", 0x10013000, pic[6]);
- sysbus_create_simple_orphan("pl061", 0x10014000, pic[7]);
- gpio2 = sysbus_create_simple_orphan("pl061", 0x10015000, pic[8]);
+ sysbus_create_simple(OBJECT(machine), "gpio[*]",
+ "pl061", 0x10013000, pic[6]);
+ sysbus_create_simple(OBJECT(machine), "gpio[*]",
+ "pl061", 0x10014000, pic[7]);
+ gpio2 = sysbus_create_simple(OBJECT(machine), "gpio[*]",
+ "pl061", 0x10015000, pic[8]);
- dev = qdev_new_orphan("pl111");
+ dev = qdev_new(OBJECT(machine), "clcd", "pl111");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
OBJECT(sysmem), &error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x10020000);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[23]);
- dev = sysbus_create_varargs_orphan("pl181", 0x10005000, pic[17], pic[18], NULL);
+ dev = sysbus_create_varargs(OBJECT(machine), "mmc", "pl181",
+ 0x10005000, pic[17], pic[18], NULL);
/* Wire up MMC card detect and read-only signals. These have
* to go to both the PL061 GPIO and the sysctl register.
* Note that the PL181 orders these lines (readonly,inserted)
* and the PL061 has them the other way about. Also the card
* detect line is inverted.
*/
- split_irq_from_named(dev, "card-read-only",
+ split_irq_from_named(OBJECT(machine), dev, "card-read-only",
qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_WPROT),
qdev_get_gpio_in(gpio2, 1));
- split_irq_from_named(dev, "card-inserted",
+ split_irq_from_named(OBJECT(machine), dev, "card-inserted",
qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_CARDIN),
qemu_irq_invert(qdev_get_gpio_in(gpio2, 0)));
@@ -271,19 +282,19 @@ static void realview_init(MachineState *machine,
if (dinfo) {
DeviceState *card;
- card = qdev_new_orphan(TYPE_SD_CARD);
+ card = qdev_new(OBJECT(machine), "sd-card", TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
- qdev_realize_and_unref(card, qdev_get_child_bus(dev, "sd-bus"),
- &error_fatal);
+ qdev_realize(card, qdev_get_child_bus(dev, "sd-bus"),
+ &error_fatal);
}
- sysbus_create_simple_orphan("pl031", 0x10017000, pic[10]);
+ sysbus_create_simple(OBJECT(machine), "rtc", "pl031", 0x10017000, pic[10]);
if (!is_pb) {
- dev = qdev_new_orphan("realview_pci");
+ dev = qdev_new(OBJECT(machine), "pci-host", "realview_pci");
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, 0x10019000); /* PCI controller registers */
sysbus_mmio_map(busdev, 1, 0x60000000); /* PCI self-config */
sysbus_mmio_map(busdev, 2, 0x61000000); /* PCI config */
@@ -297,11 +308,12 @@ static void realview_init(MachineState *machine,
sysbus_connect_irq(busdev, 3, pic[51]);
pci_bus = (PCIBus *)qdev_get_child_bus(dev, "pci");
if (machine_usb(machine)) {
- pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
+ pci_create_simple(OBJECT(machine), "ohci", pci_bus, -1, "pci-ohci");
}
n = drive_get_max_bus(IF_SCSI);
while (n >= 0) {
- dev = DEVICE(pci_create_simple_orphan(pci_bus, -1, "lsi53c895a"));
+ dev = DEVICE(pci_create_simple(OBJECT(machine), "scsi[*]",
+ pci_bus, -1, "lsi53c895a"));
lsi53c8xx_handle_legacy_cmdline(dev);
n--;
}
@@ -319,9 +331,10 @@ static void realview_init(MachineState *machine,
pci_init_nic_devices(pci_bus, "rtl8139");
}
- dev = sysbus_create_simple_orphan(TYPE_ARM_SBCON_I2C, 0x10002000, NULL);
+ dev = sysbus_create_simple(OBJECT(machine), "i2c",
+ TYPE_ARM_SBCON_I2C, 0x10002000, NULL);
i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
- i2c_slave_create_simple_orphan(i2c, "ds1338", 0x68);
+ i2c_slave_create_simple(OBJECT(machine), "ds1338", i2c, "ds1338", 0x68);
/* Memory map for RealView Emulation Baseboard: */
/* 0x10000000 System registers. */
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 061/134] hw/arm/npcm: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (59 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 060/134] hw/arm/realview, integratorcp: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 062/134] hw/arm/versatile, vexpress: " Alexander Graf
` (73 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm npcm
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/npcm7xx_boards.c:87 | qdev_new | parent | "flash[*]" | helper: threaded Object *parent from board init; multiple callers/CS → auto-index
hw/arm/npcm7xx_boards.c:116 | qdev_new | parent | "sd-card[*]" | helper: threaded Object *parent from board init; per-unit → auto-index
hw/arm/npcm7xx_boards.c:201 | i2c_slave_create_simple | parent | "tmp105[*]" | helper: threaded Object *parent from board init; 4× tmp105 → auto-index
hw/arm/npcm7xx_boards.c:203 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:205 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:207 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:237 | i2c_slave_create_simple | parent | "tmp105[*]" | helper: threaded Object *parent from board init; 4× tmp105 → auto-index
hw/arm/npcm7xx_boards.c:238 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:239 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:240 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:256 | i2c_slave_create_simple | parent | "pca9548" | helper from board init; single mux
hw/arm/npcm7xx_boards.c:336 | i2c_slave_create_simple | parent | "pca9548[*]" | helper: threaded Object *parent from board init; 4× pca9548 → auto-index
hw/arm/npcm7xx_boards.c:340 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; 8× tmp105 → auto-index
hw/arm/npcm7xx_boards.c:341 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:342 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:343 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:345 | i2c_slave_create_simple | parent | "pca9548[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:347 | i2c_slave_create_simple | parent | "pca9548[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:351 | i2c_slave_create_simple | parent | "pca9548[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:355 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:356 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:357 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx_boards.c:358 | i2c_slave_create_simple | parent | "tmp105[*]" | helper from board init; auto-index
hw/arm/npcm7xx.c:524 | sysbus_create_simple | OBJECT(dev) | "l2x0" | SoC DeviceClass.realize(dev); single L2 cache ctlr
hw/arm/npcm8xx_boards.c:64 | qdev_new | parent | "flash[*]" | helper: threaded Object *parent from board init; auto-index
hw/arm/npcm8xx_boards.c:162 | i2c_slave_create_simple | parent | "tmp105" | helper: threaded Object *parent from board init; single tmp105
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/npcm7xx.c | 2 +-
hw/arm/npcm7xx_boards.c | 107 ++++++++++++++++++++++++----------------
hw/arm/npcm8xx_boards.c | 19 ++++---
3 files changed, 77 insertions(+), 51 deletions(-)
diff --git a/hw/arm/npcm7xx.c b/hw/arm/npcm7xx.c
index 8363a04f10..a930f7843a 100644
--- a/hw/arm/npcm7xx.c
+++ b/hw/arm/npcm7xx.c
@@ -521,7 +521,7 @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
}
/* L2 cache controller */
- sysbus_create_simple_orphan("l2x0", NPCM7XX_L2C_BA, NULL);
+ sysbus_create_simple(OBJECT(dev), "l2x0", "l2x0", NPCM7XX_L2C_BA, NULL);
/* System Global Control Registers (GCR). Can fail due to user input. */
object_property_set_int(OBJECT(&s->gcr), "disabled-modules",
diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
index 7b5cdd7191..778ef0f232 100644
--- a/hw/arm/npcm7xx_boards.c
+++ b/hw/arm/npcm7xx_boards.c
@@ -78,17 +78,18 @@ static void npcm7xx_load_bootrom(MachineState *machine, NPCM7xxState *soc)
}
}
-static void npcm7xx_connect_flash(NPCM7xxFIUState *fiu, int cs_no,
- const char *flash_type, DriveInfo *dinfo)
+static void npcm7xx_connect_flash(Object *parent, NPCM7xxFIUState *fiu,
+ int cs_no, const char *flash_type,
+ DriveInfo *dinfo)
{
DeviceState *flash;
qemu_irq flash_cs;
- flash = qdev_new_orphan(flash_type);
+ flash = qdev_new(parent, "flash[*]", flash_type);
if (dinfo) {
qdev_prop_set_drive(flash, "drive", blk_by_legacy_dinfo(dinfo));
}
- qdev_realize_and_unref(flash, BUS(fiu->spi), &error_fatal);
+ qdev_realize(flash, BUS(fiu->spi), &error_fatal);
flash_cs = qdev_get_gpio_in_named(flash, SSI_GPIO_CS, 0);
qdev_connect_gpio_out_named(DEVICE(fiu), "cs", cs_no, flash_cs);
@@ -102,7 +103,7 @@ static void npcm7xx_connect_dram(NPCM7xxState *soc, MemoryRegion *dram)
&error_abort);
}
-static void sdhci_attach_drive(SDHCIState *sdhci, int unit)
+static void sdhci_attach_drive(Object *parent, SDHCIState *sdhci, int unit)
{
DriveInfo *di = drive_get(IF_SD, 0, unit);
BlockBackend *blk = di ? blk_by_legacy_dinfo(di) : NULL;
@@ -113,9 +114,9 @@ static void sdhci_attach_drive(SDHCIState *sdhci, int unit)
exit(1);
}
- DeviceState *carddev = qdev_new_orphan(TYPE_SD_CARD);
+ DeviceState *carddev = qdev_new(parent, "sd-card[*]", TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev, bus, &error_fatal);
+ qdev_realize(carddev, bus, &error_fatal);
}
static NPCM7xxState *npcm7xx_create_soc(MachineState *machine,
@@ -195,16 +196,20 @@ static void npcm7xx_connect_pwm_fan(NPCM7xxState *soc, SplitIRQ *splitter,
qdev_connect_gpio_out(DEVICE(splitter), output_no, fan_duty_gpio);
}
-static void npcm750_evb_i2c_init(NPCM7xxState *soc)
+static void npcm750_evb_i2c_init(Object *parent, NPCM7xxState *soc)
{
/* lm75 temperature sensor on SVB, tmp105 is compatible */
- i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 0), "tmp105", 0x48);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ npcm7xx_i2c_get_bus(soc, 0), "tmp105", 0x48);
/* lm75 temperature sensor on EB, tmp105 is compatible */
- i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 1), "tmp105", 0x48);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ npcm7xx_i2c_get_bus(soc, 1), "tmp105", 0x48);
/* tmp100 temperature sensor on EB, tmp105 is compatible */
- i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 2), "tmp105", 0x48);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ npcm7xx_i2c_get_bus(soc, 2), "tmp105", 0x48);
/* tmp100 temperature sensor on SVB, tmp105 is compatible */
- i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 6), "tmp105", 0x48);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ npcm7xx_i2c_get_bus(soc, 6), "tmp105", 0x48);
}
static void npcm750_evb_fan_init(NPCM7xxMachine *machine, NPCM7xxState *soc)
@@ -231,13 +236,17 @@ static void npcm750_evb_fan_init(NPCM7xxMachine *machine, NPCM7xxState *soc)
npcm7xx_connect_pwm_fan(soc, &splitter[7], 0x0f, 1);
}
-static void quanta_gsj_i2c_init(NPCM7xxState *soc)
+static void quanta_gsj_i2c_init(Object *parent, NPCM7xxState *soc)
{
/* GSJ machine have 4 max31725 temperature sensors, tmp105 is compatible. */
- i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 1), "tmp105", 0x5c);
- i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 2), "tmp105", 0x5c);
- i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 3), "tmp105", 0x5c);
- i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 4), "tmp105", 0x5c);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ npcm7xx_i2c_get_bus(soc, 1), "tmp105", 0x5c);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ npcm7xx_i2c_get_bus(soc, 2), "tmp105", 0x5c);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ npcm7xx_i2c_get_bus(soc, 3), "tmp105", 0x5c);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ npcm7xx_i2c_get_bus(soc, 4), "tmp105", 0x5c);
at24c_eeprom_init(npcm7xx_i2c_get_bus(soc, 9), 0x55, 8192);
at24c_eeprom_init(npcm7xx_i2c_get_bus(soc, 10), 0x55, 8192);
@@ -253,7 +262,8 @@ static void quanta_gsj_i2c_init(NPCM7xxState *soc)
* - ucd90160@6b
*/
- i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 15), "pca9548", 0x75);
+ i2c_slave_create_simple(parent, "pca9548",
+ npcm7xx_i2c_get_bus(soc, 15), "pca9548", 0x75);
}
static void quanta_gsj_fan_init(NPCM7xxMachine *machine, NPCM7xxState *soc)
@@ -329,33 +339,45 @@ static void quanta_gbs_i2c_init(NPCM7xxState *soc)
*/
}
-static void kudo_bmc_i2c_init(NPCM7xxState *soc)
+static void kudo_bmc_i2c_init(Object *parent, NPCM7xxState *soc)
{
I2CSlave *i2c_mux;
- i2c_mux = i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 1),
+ i2c_mux = i2c_slave_create_simple(parent, "pca9548[*]",
+ npcm7xx_i2c_get_bus(soc, 1),
TYPE_PCA9548, 0x75);
/* tmp105 is compatible with the lm75 */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 4), "tmp105", 0x5c);
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 5), "tmp105", 0x5c);
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 6), "tmp105", 0x5c);
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 7), "tmp105", 0x5c);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ pca954x_i2c_get_bus(i2c_mux, 4), "tmp105", 0x5c);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ pca954x_i2c_get_bus(i2c_mux, 5), "tmp105", 0x5c);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ pca954x_i2c_get_bus(i2c_mux, 6), "tmp105", 0x5c);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ pca954x_i2c_get_bus(i2c_mux, 7), "tmp105", 0x5c);
- i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 1), TYPE_PCA9548, 0x77);
+ i2c_slave_create_simple(parent, "pca9548[*]",
+ npcm7xx_i2c_get_bus(soc, 1), TYPE_PCA9548, 0x77);
- i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 4), TYPE_PCA9548, 0x77);
+ i2c_slave_create_simple(parent, "pca9548[*]",
+ npcm7xx_i2c_get_bus(soc, 4), TYPE_PCA9548, 0x77);
at24c_eeprom_init(npcm7xx_i2c_get_bus(soc, 4), 0x50, 8192); /* mbfru */
- i2c_mux = i2c_slave_create_simple_orphan(npcm7xx_i2c_get_bus(soc, 13),
+ i2c_mux = i2c_slave_create_simple(parent, "pca9548[*]",
+ npcm7xx_i2c_get_bus(soc, 13),
TYPE_PCA9548, 0x77);
/* tmp105 is compatible with the lm75 */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 2), "tmp105", 0x48);
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 3), "tmp105", 0x49);
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 4), "tmp105", 0x48);
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 5), "tmp105", 0x49);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ pca954x_i2c_get_bus(i2c_mux, 2), "tmp105", 0x48);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ pca954x_i2c_get_bus(i2c_mux, 3), "tmp105", 0x49);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ pca954x_i2c_get_bus(i2c_mux, 4), "tmp105", 0x48);
+ i2c_slave_create_simple(parent, "tmp105[*]",
+ pca954x_i2c_get_bus(i2c_mux, 5), "tmp105", 0x49);
at24c_eeprom_init(npcm7xx_i2c_get_bus(soc, 14), 0x55, 8192); /* bmcfru */
@@ -371,8 +393,9 @@ static void npcm750_evb_init(MachineState *machine)
qdev_realize(DEVICE(soc), NULL, &error_fatal);
npcm7xx_load_bootrom(machine, soc);
- npcm7xx_connect_flash(&soc->fiu[0], 0, "w25q256", drive_get(IF_MTD, 0, 0));
- npcm750_evb_i2c_init(soc);
+ npcm7xx_connect_flash(OBJECT(machine), &soc->fiu[0], 0, "w25q256",
+ drive_get(IF_MTD, 0, 0));
+ npcm750_evb_i2c_init(OBJECT(machine), soc);
npcm750_evb_fan_init(NPCM7XX_MACHINE(machine), soc);
npcm7xx_load_kernel(machine, soc);
}
@@ -386,9 +409,9 @@ static void quanta_gsj_init(MachineState *machine)
qdev_realize(DEVICE(soc), NULL, &error_fatal);
npcm7xx_load_bootrom(machine, soc);
- npcm7xx_connect_flash(&soc->fiu[0], 0, "mx25l25635e",
+ npcm7xx_connect_flash(OBJECT(machine), &soc->fiu[0], 0, "mx25l25635e",
drive_get(IF_MTD, 0, 0));
- quanta_gsj_i2c_init(soc);
+ quanta_gsj_i2c_init(OBJECT(machine), soc);
quanta_gsj_fan_init(NPCM7XX_MACHINE(machine), soc);
npcm7xx_load_kernel(machine, soc);
}
@@ -403,11 +426,11 @@ static void quanta_gbs_init(MachineState *machine)
npcm7xx_load_bootrom(machine, soc);
- npcm7xx_connect_flash(&soc->fiu[0], 0, "mx66u51235f",
+ npcm7xx_connect_flash(OBJECT(machine), &soc->fiu[0], 0, "mx66u51235f",
drive_get(IF_MTD, 0, 0));
quanta_gbs_i2c_init(soc);
- sdhci_attach_drive(&soc->mmc.sdhci, 0);
+ sdhci_attach_drive(OBJECT(machine), &soc->mmc.sdhci, 0);
npcm7xx_load_kernel(machine, soc);
}
@@ -420,13 +443,13 @@ static void kudo_bmc_init(MachineState *machine)
qdev_realize(DEVICE(soc), NULL, &error_fatal);
npcm7xx_load_bootrom(machine, soc);
- npcm7xx_connect_flash(&soc->fiu[0], 0, "mx66u51235f",
+ npcm7xx_connect_flash(OBJECT(machine), &soc->fiu[0], 0, "mx66u51235f",
drive_get(IF_MTD, 0, 0));
- npcm7xx_connect_flash(&soc->fiu[1], 0, "mx66u51235f",
+ npcm7xx_connect_flash(OBJECT(machine), &soc->fiu[1], 0, "mx66u51235f",
drive_get(IF_MTD, 3, 0));
- kudo_bmc_i2c_init(soc);
- sdhci_attach_drive(&soc->mmc.sdhci, 0);
+ kudo_bmc_i2c_init(OBJECT(machine), soc);
+ sdhci_attach_drive(OBJECT(machine), &soc->mmc.sdhci, 0);
npcm7xx_load_kernel(machine, soc);
}
@@ -439,7 +462,7 @@ static void mori_bmc_init(MachineState *machine)
qdev_realize(DEVICE(soc), NULL, &error_fatal);
npcm7xx_load_bootrom(machine, soc);
- npcm7xx_connect_flash(&soc->fiu[1], 0, "mx66u51235f",
+ npcm7xx_connect_flash(OBJECT(machine), &soc->fiu[1], 0, "mx66u51235f",
drive_get(IF_MTD, 3, 0));
npcm7xx_load_kernel(machine, soc);
diff --git a/hw/arm/npcm8xx_boards.c b/hw/arm/npcm8xx_boards.c
index eb0248552f..ff2840b409 100644
--- a/hw/arm/npcm8xx_boards.c
+++ b/hw/arm/npcm8xx_boards.c
@@ -55,17 +55,18 @@ static void npcm8xx_load_bootrom(MachineState *machine, NPCM8xxState *soc)
}
}
-static void npcm8xx_connect_flash(NPCM7xxFIUState *fiu, int cs_no,
- const char *flash_type, DriveInfo *dinfo)
+static void npcm8xx_connect_flash(Object *parent, NPCM7xxFIUState *fiu,
+ int cs_no, const char *flash_type,
+ DriveInfo *dinfo)
{
DeviceState *flash;
qemu_irq flash_cs;
- flash = qdev_new_orphan(flash_type);
+ flash = qdev_new(parent, "flash[*]", flash_type);
if (dinfo) {
qdev_prop_set_drive(flash, "drive", blk_by_legacy_dinfo(dinfo));
}
- qdev_realize_and_unref(flash, BUS(fiu->spi), &error_fatal);
+ qdev_realize(flash, BUS(fiu->spi), &error_fatal);
flash_cs = qdev_get_gpio_in_named(flash, SSI_GPIO_CS, 0);
qdev_connect_gpio_out_named(DEVICE(fiu), "cs", cs_no, flash_cs);
@@ -156,10 +157,11 @@ static void npcm8xx_connect_pwm_fan(NPCM8xxState *soc, SplitIRQ *splitter,
qdev_connect_gpio_out(DEVICE(splitter), output_no, fan_duty_gpio);
}
-static void npcm845_evb_i2c_init(NPCM8xxState *soc)
+static void npcm845_evb_i2c_init(Object *parent, NPCM8xxState *soc)
{
/* tmp100 temperature sensor on SVB, tmp105 is compatible */
- i2c_slave_create_simple_orphan(npcm8xx_i2c_get_bus(soc, 6), "tmp105", 0x48);
+ i2c_slave_create_simple(parent, "tmp105",
+ npcm8xx_i2c_get_bus(soc, 6), "tmp105", 0x48);
}
static void npcm845_evb_fan_init(NPCM8xxMachine *machine, NPCM8xxState *soc)
@@ -195,8 +197,9 @@ static void npcm845_evb_init(MachineState *machine)
qdev_realize(DEVICE(soc), NULL, &error_fatal);
npcm8xx_load_bootrom(machine, soc);
- npcm8xx_connect_flash(&soc->fiu[0], 0, "w25q256", drive_get(IF_MTD, 0, 0));
- npcm845_evb_i2c_init(soc);
+ npcm8xx_connect_flash(OBJECT(machine), &soc->fiu[0], 0, "w25q256",
+ drive_get(IF_MTD, 0, 0));
+ npcm845_evb_i2c_init(OBJECT(machine), soc);
npcm845_evb_fan_init(NPCM8XX_MACHINE(machine), soc);
npcm8xx_load_kernel(machine, soc);
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 062/134] hw/arm/versatile, vexpress: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (60 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 061/134] hw/arm/npcm: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 063/134] hw/arm/stellaris, musicpal: " Alexander Graf
` (72 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm versatile, vexpress
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/versatilepb.c:229 | qdev_new | OBJECT(machine) | "sysctl" | board init(); machine owns onboard sysctl
hw/arm/versatilepb.c:235 | sysbus_create_varargs | OBJECT(machine) | "vic" | board init(); PL190 primary intc
hw/arm/versatilepb.c:242 | sysbus_create_simple | OBJECT(machine) | "sic" | board init(); secondary intc
hw/arm/versatilepb.c:248 | sysbus_create_simple | OBJECT(machine) | "keyboard" | board init(); single KMI kbd
hw/arm/versatilepb.c:249 | sysbus_create_simple | OBJECT(machine) | "mouse" | board init(); single KMI mouse
hw/arm/versatilepb.c:251 | qdev_new | OBJECT(machine) | "pci-host" | board init(); versatile PCI host bridge
hw/arm/versatilepb.c:273 | pci_create_simple | OBJECT(machine) | "usb" | board init(); optional OHCI on PCI bus
hw/arm/versatilepb.c:277 | pci_create_simple | OBJECT(machine) | "scsi[*]" | board init(); loop over IF_SCSI buses
hw/arm/versatilepb.c:287 | qdev_new | OBJECT(machine) | "dma" | board init(); PL080 DMA
hw/arm/versatilepb.c:295 | sysbus_create_simple | OBJECT(machine) | "timer[*]" | board init(); two SP804 blocks
hw/arm/versatilepb.c:296 | sysbus_create_simple | OBJECT(machine) | "timer[*]" | board init(); auto-index sibling
hw/arm/versatilepb.c:298 | sysbus_create_simple | OBJECT(machine) | "gpio[*]" | board init(); four PL061 ports
hw/arm/versatilepb.c:299 | sysbus_create_simple | OBJECT(machine) | "gpio[*]" | board init(); auto-index sibling
hw/arm/versatilepb.c:300 | sysbus_create_simple | OBJECT(machine) | "gpio[*]" | board init(); auto-index sibling
hw/arm/versatilepb.c:301 | sysbus_create_simple | OBJECT(machine) | "gpio[*]" | board init(); auto-index sibling
hw/arm/versatilepb.c:305 | qdev_new | OBJECT(machine) | "clcd" | board init(); PL110 display
hw/arm/versatilepb.c:315 | sysbus_create_varargs | OBJECT(machine) | "mmci[*]" | board init(); two PL181 MMCI
hw/arm/versatilepb.c:320 | qdev_new | OBJECT(machine) | "sd-card[*]" | board init(); removable card owned by machine
hw/arm/versatilepb.c:327 | sysbus_create_varargs | OBJECT(machine) | "mmci[*]" | board init(); auto-index sibling
hw/arm/versatilepb.c:332 | qdev_new | OBJECT(machine) | "sd-card[*]" | board init(); auto-index sibling
hw/arm/versatilepb.c:340 | sysbus_create_simple | OBJECT(machine) | "rtc" | board init(); PL031 RTC
hw/arm/versatilepb.c:342 | sysbus_create_simple | OBJECT(machine) | "i2c" | board init(); SBCon I2C bridge
hw/arm/versatilepb.c:344 | i2c_slave_create_simple | OBJECT(machine) | "ds1338" | board init(); onboard I2C RTC chip
hw/arm/versatilepb.c:347 | qdev_new | OBJECT(machine) | "aaci" | board init(); PL041 audio
hw/arm/vexpress.c:244 | qdev_new | OBJECT(ms) | "mpcore" | init_cpus() takes MachineState *ms; A9/A15 priv block
hw/arm/vexpress.c:304 | qdev_new | OBJECT(vms) | "db-clcd" | a9_daughterboard_init() has vms; distinct from motherboard clcd
hw/arm/vexpress.c:316 | sysbus_create_simple | OBJECT(vms) | "timer[*]" | a9 daughterboard SP804; auto-index shared with motherboard timers
hw/arm/vexpress.c:324 | sysbus_create_varargs | OBJECT(vms) | "l2x0" | a9 daughterboard L2 cache ctrl
hw/arm/vexpress.c:520 | qdev_new | parent | "flash[*]" | helper: thread Object *parent as first arg; two callers pass OBJECT(machine)
hw/arm/vexpress.c:595 | qdev_new | OBJECT(machine) | "sysctl" | vexpress_common_init(MachineState *machine)
hw/arm/vexpress.c:617 | qdev_new | OBJECT(machine) | "aaci" | board init(); PL041 audio
hw/arm/vexpress.c:626 | sysbus_create_varargs | OBJECT(machine) | "mmci" | board init(); single PL181
hw/arm/vexpress.c:636 | qdev_new | OBJECT(machine) | "sd-card" | board init(); single removable SD
hw/arm/vexpress.c:643 | sysbus_create_simple | OBJECT(machine) | "keyboard" | board init(); KMI0
hw/arm/vexpress.c:644 | sysbus_create_simple | OBJECT(machine) | "mouse" | board init(); KMI1
hw/arm/vexpress.c:651 | sysbus_create_simple | OBJECT(machine) | "timer[*]" | board init(); motherboard SP804
hw/arm/vexpress.c:652 | sysbus_create_simple | OBJECT(machine) | "timer[*]" | board init(); auto-index sibling
hw/arm/vexpress.c:654 | sysbus_create_simple | OBJECT(machine) | "i2c" | board init(); SBCon serial DVI I2C
hw/arm/vexpress.c:656 | i2c_slave_create_simple | OBJECT(machine) | "sii9022" | board init(); HDMI transmitter chip
hw/arm/vexpress.c:658 | sysbus_create_simple | OBJECT(machine) | "rtc" | board init(); PL031
hw/arm/vexpress.c:662 | qdev_new | OBJECT(machine) | "clcd" | board init(); motherboard PL111
hw/arm/vexpress.c:709 | sysbus_create_simple | OBJECT(machine) | "virtio-mmio[*]" | board init(); loop of transports
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/versatilepb.c | 70 +++++++++++++++++++++++---------------------
hw/arm/vexpress.c | 66 +++++++++++++++++++++--------------------
2 files changed, 72 insertions(+), 64 deletions(-)
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index 6fb7223265..f68c4765c6 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -226,31 +226,33 @@ static void versatile_init(MachineState *machine, int board_id)
/* SDRAM at address zero. */
memory_region_add_subregion(sysmem, 0, machine->ram);
- sysctl = qdev_new_orphan("realview_sysctl");
+ sysctl = qdev_new(OBJECT(machine), "sysctl", "realview_sysctl");
qdev_prop_set_uint32(sysctl, "sys_id", 0x41007004);
qdev_prop_set_uint32(sysctl, "proc_id", 0x02000000);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(sysctl), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(sysctl), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(sysctl), 0, 0x10000000);
- dev = sysbus_create_varargs_orphan("pl190", 0x10140000,
+ dev = sysbus_create_varargs(OBJECT(machine), "vic", "pl190", 0x10140000,
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ),
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_FIQ),
NULL);
for (n = 0; n < 32; n++) {
pic[n] = qdev_get_gpio_in(dev, n);
}
- dev = sysbus_create_simple_orphan(TYPE_VERSATILE_PB_SIC, 0x10003000, NULL);
+ dev = sysbus_create_simple(OBJECT(machine), "sic",
+ TYPE_VERSATILE_PB_SIC, 0x10003000, NULL);
for (n = 0; n < 32; n++) {
sysbus_connect_irq(SYS_BUS_DEVICE(dev), n, pic[n]);
sic[n] = qdev_get_gpio_in(dev, n);
}
- sysbus_create_simple_orphan("pl050_keyboard", 0x10006000, sic[3]);
- sysbus_create_simple_orphan("pl050_mouse", 0x10007000, sic[4]);
+ sysbus_create_simple(OBJECT(machine), "keyboard", "pl050_keyboard",
+ 0x10006000, sic[3]);
+ sysbus_create_simple(OBJECT(machine), "mouse", "pl050_mouse", 0x10007000, sic[4]);
- dev = qdev_new_orphan("versatile_pci");
+ dev = qdev_new(OBJECT(machine), "pci-host", "versatile_pci");
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, 0x10001000); /* PCI controller regs */
sysbus_mmio_map(busdev, 1, 0x41000000); /* PCI self-config */
sysbus_mmio_map(busdev, 2, 0x42000000); /* PCI config */
@@ -270,11 +272,12 @@ static void versatile_init(MachineState *machine, int board_id)
pci_init_nic_devices(pci_bus, "rtl8139");
if (machine_usb(machine)) {
- pci_create_simple_orphan(pci_bus, -1, "pci-ohci");
+ pci_create_simple(OBJECT(machine), "usb", pci_bus, -1, "pci-ohci");
}
n = drive_get_max_bus(IF_SCSI);
while (n >= 0) {
- dev = DEVICE(pci_create_simple_orphan(pci_bus, -1, "lsi53c895a"));
+ dev = DEVICE(pci_create_simple(OBJECT(machine), "scsi[*]",
+ pci_bus, -1, "lsi53c895a"));
lsi53c8xx_handle_legacy_cmdline(dev);
n--;
}
@@ -284,72 +287,73 @@ static void versatile_init(MachineState *machine, int board_id)
pl011_create(OBJECT(machine), 0x101f3000, pic[14], serial_hd(2));
pl011_create(OBJECT(machine), 0x10009000, sic[6], serial_hd(3));
- dev = qdev_new_orphan("pl080");
+ dev = qdev_new(OBJECT(machine), "dma", "pl080");
object_property_set_link(OBJECT(dev), "downstream", OBJECT(sysmem),
&error_fatal);
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, 0x10130000);
sysbus_connect_irq(busdev, 0, pic[17]);
- sysbus_create_simple_orphan("sp804", 0x101e2000, pic[4]);
- sysbus_create_simple_orphan("sp804", 0x101e3000, pic[5]);
+ sysbus_create_simple(OBJECT(machine), "timer[*]", "sp804", 0x101e2000, pic[4]);
+ sysbus_create_simple(OBJECT(machine), "timer[*]", "sp804", 0x101e3000, pic[5]);
- sysbus_create_simple_orphan("pl061", 0x101e4000, pic[6]);
- sysbus_create_simple_orphan("pl061", 0x101e5000, pic[7]);
- sysbus_create_simple_orphan("pl061", 0x101e6000, pic[8]);
- sysbus_create_simple_orphan("pl061", 0x101e7000, pic[9]);
+ sysbus_create_simple(OBJECT(machine), "gpio[*]", "pl061", 0x101e4000, pic[6]);
+ sysbus_create_simple(OBJECT(machine), "gpio[*]", "pl061", 0x101e5000, pic[7]);
+ sysbus_create_simple(OBJECT(machine), "gpio[*]", "pl061", 0x101e6000, pic[8]);
+ sysbus_create_simple(OBJECT(machine), "gpio[*]", "pl061", 0x101e7000, pic[9]);
/* The versatile/PB actually has a modified Color LCD controller
that includes hardware cursor support from the PL111. */
- dev = qdev_new_orphan("pl110_versatile");
+ dev = qdev_new(OBJECT(machine), "clcd", "pl110_versatile");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
OBJECT(sysmem), &error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x10120000);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[16]);
/* Wire up the mux control signals from the SYS_CLCD register */
qdev_connect_gpio_out(sysctl, 0, qdev_get_gpio_in(dev, 0));
- dev = sysbus_create_varargs_orphan("pl181", 0x10005000, sic[22], sic[1], NULL);
+ dev = sysbus_create_varargs(OBJECT(machine), "mmci[*]", "pl181",
+ 0x10005000, sic[22], sic[1], NULL);
dinfo = drive_get(IF_SD, 0, 0);
if (dinfo) {
DeviceState *card;
- card = qdev_new_orphan(TYPE_SD_CARD);
+ card = qdev_new(OBJECT(machine), "sd-card[*]", TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
- qdev_realize_and_unref(card, qdev_get_child_bus(dev, "sd-bus"),
- &error_fatal);
+ qdev_realize(card, qdev_get_child_bus(dev, "sd-bus"), &error_fatal);
}
- dev = sysbus_create_varargs_orphan("pl181", 0x1000b000, sic[23], sic[2], NULL);
+ dev = sysbus_create_varargs(OBJECT(machine), "mmci[*]", "pl181",
+ 0x1000b000, sic[23], sic[2], NULL);
dinfo = drive_get(IF_SD, 0, 1);
if (dinfo) {
DeviceState *card;
- card = qdev_new_orphan(TYPE_SD_CARD);
+ card = qdev_new(OBJECT(machine), "sd-card[*]", TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
- qdev_realize_and_unref(card, qdev_get_child_bus(dev, "sd-bus"),
- &error_fatal);
+ qdev_realize(card, qdev_get_child_bus(dev, "sd-bus"), &error_fatal);
}
/* Add PL031 Real Time Clock. */
- sysbus_create_simple_orphan("pl031", 0x101e8000, pic[10]);
+ sysbus_create_simple(OBJECT(machine), "rtc", "pl031", 0x101e8000, pic[10]);
- dev = sysbus_create_simple_orphan(TYPE_ARM_SBCON_I2C, 0x10002000, NULL);
+ dev = sysbus_create_simple(OBJECT(machine), "i2c",
+ TYPE_ARM_SBCON_I2C, 0x10002000, NULL);
i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
- i2c_slave_create_simple_orphan(i2c, "ds1338", 0x68);
+ i2c_slave_create_simple(OBJECT(machine), "ds1338", i2c, "ds1338", 0x68);
/* Add PL041 AACI Interface to the LM4549 codec */
- pl041 = qdev_new_orphan("pl041");
+ pl041 = qdev_new(OBJECT(machine), "aaci", "pl041");
qdev_prop_set_uint32(pl041, "nc_fifo_depth", 512);
if (machine->audiodev) {
qdev_prop_set_string(pl041, "audiodev", machine->audiodev);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(pl041), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(pl041), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(pl041), 0, 0x10004000);
sysbus_connect_irq(SYS_BUS_DEVICE(pl041), 0, sic[24]);
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index 7c5a69b5a9..a643c6b079 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -241,11 +241,11 @@ static void init_cpus(MachineState *ms, const char *cpu_type,
* this must happen after the CPUs are created because a15mpcore_priv
* wires itself up to the CPU's generic_timer gpio out lines.
*/
- dev = qdev_new_orphan(privdev);
+ dev = qdev_new(OBJECT(ms), "mpcore", privdev);
qdev_prop_set_uint32(dev, "num-cpu", smp_cpus);
qdev_prop_set_uint32(dev, "num-irq", GIC_EXT_IRQS + GIC_INTERNAL);
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, periphbase);
/* Interrupts [42:0] are from the motherboard;
@@ -301,10 +301,10 @@ static void a9_daughterboard_init(VexpressMachineState *vms,
/* Daughterboard peripherals : 0x10020000 .. 0x20000000 */
/* 0x10020000 PL111 CLCD (daughterboard) */
- dev = qdev_new_orphan("pl111");
+ dev = qdev_new(OBJECT(vms), "db-clcd", "pl111");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
OBJECT(sysmem), &error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x10020000);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[44]);
@@ -313,7 +313,7 @@ static void a9_daughterboard_init(VexpressMachineState *vms,
/* 0x100e1000 PL354 Static Memory Controller */
/* 0x100e2000 System Configuration Controller */
- sysbus_create_simple_orphan("sp804", 0x100e4000, pic[48]);
+ sysbus_create_simple(OBJECT(vms), "timer[*]", "sp804", 0x100e4000, pic[48]);
/* 0x100e5000 SP805 Watchdog module */
/* 0x100e6000 BP147 TrustZone Protection Controller */
/* 0x100e9000 PL301 'Fast' AXI matrix */
@@ -321,7 +321,7 @@ static void a9_daughterboard_init(VexpressMachineState *vms,
/* 0x100ec000 TrustZone Address Space Controller */
/* 0x10200000 CoreSight debug APB */
/* 0x1e00a000 PL310 L2 Cache Controller */
- sysbus_create_varargs_orphan("l2x0", 0x1e00a000, NULL);
+ sysbus_create_varargs(OBJECT(vms), "l2x0", "l2x0", 0x1e00a000, NULL);
}
/* Voltage values for SYS_CFG_VOLT daughterboard registers;
@@ -514,10 +514,11 @@ static void vexpress_modify_dtb(const struct arm_boot_info *info, void *fdt)
/* Open code a private version of pflash registration since we
* need to set non-default device width for VExpress platform.
*/
-static PFlashCFI01 *ve_pflash_cfi01_register(hwaddr base, const char *name,
+static PFlashCFI01 *ve_pflash_cfi01_register(Object *parent,
+ hwaddr base, const char *name,
DriveInfo *di)
{
- DeviceState *dev = qdev_new_orphan(TYPE_PFLASH_CFI01);
+ DeviceState *dev = qdev_new(parent, "flash[*]", TYPE_PFLASH_CFI01);
if (di) {
qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(di));
@@ -534,7 +535,7 @@ static PFlashCFI01 *ve_pflash_cfi01_register(hwaddr base, const char *name,
qdev_prop_set_uint16(dev, "id2", 0x00);
qdev_prop_set_uint16(dev, "id3", 0x00);
qdev_prop_set_string(dev, "name", name);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
return PFLASH_CFI01(dev);
@@ -592,7 +593,7 @@ static void vexpress_common_init(MachineState *machine)
sys_id = 0x1190f500;
- sysctl = qdev_new_orphan("realview_sysctl");
+ sysctl = qdev_new(OBJECT(machine), "sysctl", "realview_sysctl");
qdev_prop_set_uint32(sysctl, "sys_id", sys_id);
qdev_prop_set_uint32(sysctl, "proc_id", daughterboard->proc_id);
@@ -608,22 +609,23 @@ static void vexpress_common_init(MachineState *machine)
}
qdev_prop_set_array(sysctl, "db-clock", db_clock);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(sysctl), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(sysctl), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(sysctl), 0, map[VE_SYSREGS]);
/* VE_SP810: not modelled */
/* VE_SERIALPCI: not modelled */
- pl041 = qdev_new_orphan("pl041");
+ pl041 = qdev_new(OBJECT(machine), "aaci", "pl041");
qdev_prop_set_uint32(pl041, "nc_fifo_depth", 512);
if (machine->audiodev) {
qdev_prop_set_string(pl041, "audiodev", machine->audiodev);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(pl041), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(pl041), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(pl041), 0, map[VE_PL041]);
sysbus_connect_irq(SYS_BUS_DEVICE(pl041), 0, pic[11]);
- dev = sysbus_create_varargs_orphan("pl181", map[VE_MMCI], pic[9], pic[10], NULL);
+ dev = sysbus_create_varargs(OBJECT(machine), "mmci", "pl181",
+ map[VE_MMCI], pic[9], pic[10], NULL);
/* Wire up MMC card detect and read-only signals */
qdev_connect_gpio_out_named(dev, "card-read-only", 0,
qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_WPROT));
@@ -633,42 +635,43 @@ static void vexpress_common_init(MachineState *machine)
if (dinfo) {
DeviceState *card;
- card = qdev_new_orphan(TYPE_SD_CARD);
+ card = qdev_new(OBJECT(machine), "sd-card", TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
- qdev_realize_and_unref(card, qdev_get_child_bus(dev, "sd-bus"),
- &error_fatal);
+ qdev_realize(card, qdev_get_child_bus(dev, "sd-bus"), &error_fatal);
}
- sysbus_create_simple_orphan("pl050_keyboard", map[VE_KMI0], pic[12]);
- sysbus_create_simple_orphan("pl050_mouse", map[VE_KMI1], pic[13]);
+ sysbus_create_simple(OBJECT(machine), "keyboard", "pl050_keyboard",
+ map[VE_KMI0], pic[12]);
+ sysbus_create_simple(OBJECT(machine), "mouse", "pl050_mouse", map[VE_KMI1], pic[13]);
pl011_create(OBJECT(machine), map[VE_UART0], pic[5], serial_hd(0));
pl011_create(OBJECT(machine), map[VE_UART1], pic[6], serial_hd(1));
pl011_create(OBJECT(machine), map[VE_UART2], pic[7], serial_hd(2));
pl011_create(OBJECT(machine), map[VE_UART3], pic[8], serial_hd(3));
- sysbus_create_simple_orphan("sp804", map[VE_TIMER01], pic[2]);
- sysbus_create_simple_orphan("sp804", map[VE_TIMER23], pic[3]);
+ sysbus_create_simple(OBJECT(machine), "timer[*]", "sp804", map[VE_TIMER01], pic[2]);
+ sysbus_create_simple(OBJECT(machine), "timer[*]", "sp804", map[VE_TIMER23], pic[3]);
- dev = sysbus_create_simple_orphan(TYPE_ARM_SBCON_I2C, map[VE_SERIALDVI], NULL);
+ dev = sysbus_create_simple(OBJECT(machine), "i2c",
+ TYPE_ARM_SBCON_I2C, map[VE_SERIALDVI], NULL);
i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
- i2c_slave_create_simple_orphan(i2c, "sii9022", 0x39);
+ i2c_slave_create_simple(OBJECT(machine), "sii9022", i2c, "sii9022", 0x39);
- sysbus_create_simple_orphan("pl031", map[VE_RTC], pic[4]); /* RTC */
+ sysbus_create_simple(OBJECT(machine), "rtc", "pl031", map[VE_RTC], pic[4]); /* RTC */
/* VE_COMPACTFLASH: not modelled */
- dev = qdev_new_orphan("pl111");
+ dev = qdev_new(OBJECT(machine), "clcd", "pl111");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
OBJECT(sysmem), &error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, map[VE_CLCD]);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[14]);
dinfo = drive_get(IF_PFLASH, 0, 0);
- pflash0 = ve_pflash_cfi01_register(map[VE_NORFLASH0], "vexpress.flash0",
- dinfo);
+ pflash0 = ve_pflash_cfi01_register(OBJECT(machine), map[VE_NORFLASH0],
+ "vexpress.flash0", dinfo);
if (map[VE_NORFLASHALIAS] != -1) {
/* Map flash 0 as an alias into low memory */
@@ -680,7 +683,8 @@ static void vexpress_common_init(MachineState *machine)
}
dinfo = drive_get(IF_PFLASH, 0, 1);
- ve_pflash_cfi01_register(map[VE_NORFLASH1], "vexpress.flash1", dinfo);
+ ve_pflash_cfi01_register(OBJECT(machine), map[VE_NORFLASH1],
+ "vexpress.flash1", dinfo);
sram_size = 0x2000000;
memory_region_init_ram(&vms->sram, NULL, "vexpress.sram", sram_size,
@@ -706,8 +710,8 @@ static void vexpress_common_init(MachineState *machine)
* no backend is created the transport will just sit harmlessly idle.
*/
for (i = 0; i < NUM_VIRTIO_TRANSPORTS; i++) {
- sysbus_create_simple_orphan("virtio-mmio", map[VE_VIRTIO] + 0x200 * i,
- pic[40 + i]);
+ sysbus_create_simple(OBJECT(machine), "virtio-mmio[*]", "virtio-mmio",
+ map[VE_VIRTIO] + 0x200 * i, pic[40 + i]);
}
daughterboard->bootinfo.ram_size = machine->ram_size;
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 063/134] hw/arm/stellaris, musicpal: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (61 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 062/134] hw/arm/versatile, vexpress: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 064/134] hw/arm/exynos: " Alexander Graf
` (71 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm stellaris, musicpal
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/musicpal.c:1235 | cpu_create | OBJECT(machine) | "cpu" | musicpal_init(MachineState *machine); single CPU
hw/arm/musicpal.c:1243 | sysbus_create_simple | OBJECT(machine) | "pic" | board init(); primary intc
hw/arm/musicpal.c:1245 | sysbus_create_varargs | OBJECT(machine) | "pit" | board init(); MV88W8618 timer block
hw/arm/musicpal.c:1252 | qdev_new | OBJECT(machine) | "uart-orgate" | board init(); OR-IRQ combiner
hw/arm/musicpal.c:1290 | sysbus_create_simple | OBJECT(machine) | "flashcfg" | board init(); flash config regs
hw/arm/musicpal.c:1292 | qdev_new | OBJECT(machine) | "eth" | board init(); on-chip ethernet
hw/arm/musicpal.c:1301 | sysbus_create_simple | OBJECT(machine) | "wlan" | board init(); WLAN stub
hw/arm/musicpal.c:1303 | sysbus_create_simple | OBJECT(machine) | "misc" | board init(); misc regs
hw/arm/musicpal.c:1305 | sysbus_create_simple | OBJECT(machine) | "gpio" | board init(); GPIO block
hw/arm/musicpal.c:1307 | sysbus_create_simple | OBJECT(machine) | "i2c" | board init(); bit-bang GPIO I2C
hw/arm/musicpal.c:1310 | sysbus_create_simple | OBJECT(machine) | "lcd" | board init(); front-panel LCD
hw/arm/musicpal.c:1311 | sysbus_create_simple | OBJECT(machine) | "keys" | board init(); front-panel buttons
hw/arm/musicpal.c:1331 | i2c_slave_new | OBJECT(machine) | "wm8750" | board init(); audio codec on I2C bus
hw/arm/musicpal.c:1337 | qdev_new | OBJECT(machine) | "audio" | board init(); audio DMA controller
hw/arm/stellaris.c:1099 | qdev_new | soc_container | "sys" | collapse existing add_child; keep name
hw/arm/stellaris.c:1126 | qdev_new | soc_container | "v7m" | collapse existing add_child; keep name
hw/arm/stellaris.c:1146 | sysbus_create_varargs | soc_container | "adc" | board init(); on-SoC ADC
hw/arm/stellaris.c:1160 | qdev_new | soc_container | "gptm[*]" | collapse existing add_child; keep name
hw/arm/stellaris.c:1175 | qdev_new | soc_container | "wdg" | collapse existing add_child; keep name
hw/arm/stellaris.c:1192 | sysbus_create_simple | soc_container | "gpio[*]" | board init(); loop over PL061 ports
hw/arm/stellaris.c:1204 | sysbus_create_simple | soc_container | "i2c[*]" | board init(); loop over I2C blocks
hw/arm/stellaris.c:1212 | i2c_slave_create_simple | OBJECT(ms) | "oled-i2c" | board init(); external I2C OLED panel
hw/arm/stellaris.c:1219 | qdev_new | soc_container | "uart[*]" | collapse existing add_child; keep name
hw/arm/stellaris.c:1229 | sysbus_create_simple | soc_container | "ssi" | board init(); PL022 SPI
hw/arm/stellaris.c:1303 | ssi_create_peripheral | OBJECT(ms) | "ssi-sd" | board init(); external SD adapter on SSI bus
hw/arm/stellaris.c:1307 | qdev_new | OBJECT(ms) | "sd-card" | board init(); removable SD card
hw/arm/stellaris.c:1313 | qdev_new | OBJECT(ms) | "oled" | collapse existing add_child; keep name
hw/arm/stellaris.c:1318 | qdev_new | OBJECT(ms) | "splitter" | collapse existing add_child; keep name
hw/arm/stellaris.c:1340 | qdev_new | soc_container | "enet" | collapse existing add_child; keep name
hw/arm/stellaris.c:1360 | qdev_new | OBJECT(ms) | "gamepad" | collapse existing add_child; keep name
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/musicpal.c | 41 ++++++++++++++++------------
hw/arm/stellaris.c | 68 ++++++++++++++++++++--------------------------
2 files changed, 53 insertions(+), 56 deletions(-)
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index d9fe08d57b..86ea348d3d 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1232,7 +1232,7 @@ static void musicpal_init(MachineState *machine)
exit(EXIT_FAILURE);
}
- cpu = ARM_CPU(cpu_create_orphan(machine->cpu_type));
+ cpu = ARM_CPU(cpu_create(OBJECT(machine), "cpu", machine->cpu_type));
memory_region_add_subregion(address_space_mem, 0, machine->ram);
@@ -1240,18 +1240,20 @@ static void musicpal_init(MachineState *machine)
&error_fatal);
memory_region_add_subregion(address_space_mem, MP_SRAM_BASE, sram);
- pic = sysbus_create_simple_orphan(TYPE_MV88W8618_PIC, MP_PIC_BASE,
+ pic = sysbus_create_simple(OBJECT(machine), "pic",
+ TYPE_MV88W8618_PIC, MP_PIC_BASE,
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ));
- sysbus_create_varargs_orphan(TYPE_MV88W8618_PIT, MP_PIT_BASE,
+ sysbus_create_varargs(OBJECT(machine), "pit",
+ TYPE_MV88W8618_PIT, MP_PIT_BASE,
qdev_get_gpio_in(pic, MP_TIMER1_IRQ),
qdev_get_gpio_in(pic, MP_TIMER2_IRQ),
qdev_get_gpio_in(pic, MP_TIMER3_IRQ),
qdev_get_gpio_in(pic, MP_TIMER4_IRQ), NULL);
/* Logically OR both UART IRQs together */
- uart_orgate = qdev_new_orphan(TYPE_OR_IRQ);
+ uart_orgate = qdev_new(OBJECT(machine), "uart-orgate", TYPE_OR_IRQ);
object_property_set_int(OBJECT(uart_orgate), "num-lines", 2, &error_fatal);
- qdev_realize_and_unref(uart_orgate, NULL, &error_fatal);
+ qdev_realize(uart_orgate, NULL, &error_fatal);
qdev_connect_gpio_out(uart_orgate, 0,
qdev_get_gpio_in(pic, MP_UART_SHARED_IRQ));
@@ -1287,28 +1289,31 @@ static void musicpal_init(MachineState *machine)
2, 0x00BF, 0x236D, 0x0000, 0x0000,
0x5555, 0x2AAA, 0);
}
- sysbus_create_simple_orphan(TYPE_MV88W8618_FLASHCFG, MP_FLASHCFG_BASE, NULL);
+ sysbus_create_simple(OBJECT(machine), "flashcfg",
+ TYPE_MV88W8618_FLASHCFG, MP_FLASHCFG_BASE, NULL);
- dev = qdev_new_orphan(TYPE_MV88W8618_ETH);
+ dev = qdev_new(OBJECT(machine), "eth", TYPE_MV88W8618_ETH);
qemu_configure_nic_device(dev, true, "mv88w8618");
object_property_set_link(OBJECT(dev), "dma-memory",
OBJECT(get_system_memory()), &error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, MP_ETH_BASE);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
qdev_get_gpio_in(pic, MP_ETH_IRQ));
- sysbus_create_simple_orphan("mv88w8618_wlan", MP_WLAN_BASE, NULL);
+ sysbus_create_simple(OBJECT(machine), "wlan", "mv88w8618_wlan", MP_WLAN_BASE, NULL);
- sysbus_create_simple_orphan(TYPE_MUSICPAL_MISC, MP_MISC_BASE, NULL);
+ sysbus_create_simple(OBJECT(machine), "misc", TYPE_MUSICPAL_MISC, MP_MISC_BASE, NULL);
- dev = sysbus_create_simple_orphan(TYPE_MUSICPAL_GPIO, MP_GPIO_BASE,
+ dev = sysbus_create_simple(OBJECT(machine), "gpio",
+ TYPE_MUSICPAL_GPIO, MP_GPIO_BASE,
qdev_get_gpio_in(pic, MP_GPIO_IRQ));
- i2c_dev = sysbus_create_simple_orphan(TYPE_GPIO_I2C, -1, NULL);
+ i2c_dev = sysbus_create_simple(OBJECT(machine), "i2c", TYPE_GPIO_I2C, -1, NULL);
i2c = (I2CBus *)qdev_get_child_bus(i2c_dev, "i2c");
- lcd_dev = sysbus_create_simple_orphan(TYPE_MUSICPAL_LCD, MP_LCD_BASE, NULL);
- key_dev = sysbus_create_simple_orphan(TYPE_MUSICPAL_KEY, -1, NULL);
+ lcd_dev = sysbus_create_simple(OBJECT(machine), "lcd",
+ TYPE_MUSICPAL_LCD, MP_LCD_BASE, NULL);
+ key_dev = sysbus_create_simple(OBJECT(machine), "keys", TYPE_MUSICPAL_KEY, -1, NULL);
/* I2C read data */
qdev_connect_gpio_out(i2c_dev, 0,
@@ -1328,17 +1333,17 @@ static void musicpal_init(MachineState *machine)
qdev_connect_gpio_out(key_dev, i, qdev_get_gpio_in(dev, i + 15));
}
- wm8750_dev = i2c_slave_new_orphan(TYPE_WM8750, MP_WM_ADDR);
+ wm8750_dev = i2c_slave_new(OBJECT(machine), "wm8750", TYPE_WM8750, MP_WM_ADDR);
if (machine->audiodev) {
qdev_prop_set_string(DEVICE(wm8750_dev), "audiodev", machine->audiodev);
}
- i2c_slave_realize_and_unref(wm8750_dev, i2c, &error_abort);
+ qdev_realize(DEVICE(wm8750_dev), BUS(i2c), &error_abort);
- dev = qdev_new_orphan(TYPE_MV88W8618_AUDIO);
+ dev = qdev_new(OBJECT(machine), "audio", TYPE_MV88W8618_AUDIO);
s = SYS_BUS_DEVICE(dev);
object_property_set_link(OBJECT(dev), "wm8750", OBJECT(wm8750_dev),
NULL);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, MP_AUDIO_BASE);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(pic, MP_AUDIO_IRQ));
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index 7a18d98477..b2ff6f4d97 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1096,8 +1096,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
* Create the system-registers object early, because we will
* need its sysclk output.
*/
- ssys_dev = qdev_new_orphan(TYPE_STELLARIS_SYS);
- object_property_add_child(soc_container, "sys", OBJECT(ssys_dev));
+ ssys_dev = qdev_new(soc_container, "sys", TYPE_STELLARIS_SYS);
/*
* Most devices come preprogrammed with a MAC address in the user data.
@@ -1121,10 +1120,9 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
qdev_prop_set_uint32(ssys_dev, "dc2", board->dc2);
qdev_prop_set_uint32(ssys_dev, "dc3", board->dc3);
qdev_prop_set_uint32(ssys_dev, "dc4", board->dc4);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(ssys_dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(ssys_dev), &error_fatal);
- armv7m = qdev_new_orphan(TYPE_ARMV7M);
- object_property_add_child(soc_container, "v7m", OBJECT(armv7m));
+ armv7m = qdev_new(soc_container, "v7m", TYPE_ARMV7M);
qdev_prop_set_uint32(armv7m, "num-irq", NUM_IRQ_LINES);
qdev_prop_set_uint8(armv7m, "num-prio-bits", NUM_PRIO_BITS);
qdev_prop_set_string(armv7m, "cpu-type", ms->cpu_type);
@@ -1135,7 +1133,7 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
object_property_set_link(OBJECT(armv7m), "memory",
OBJECT(get_system_memory()), &error_abort);
/* This will exit with an error if the user passed us a bad cpu_type */
- sysbus_realize_and_unref(SYS_BUS_DEVICE(armv7m), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(armv7m), &error_fatal);
nvic = armv7m;
/* Now we can wire up the IRQ and MMIO of the system registers */
@@ -1143,7 +1141,8 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
sysbus_connect_irq(SYS_BUS_DEVICE(ssys_dev), 0, qdev_get_gpio_in(nvic, 28));
if (DEV_CAP(1, ADC)) {
- dev = sysbus_create_varargs_orphan(TYPE_STELLARIS_ADC, 0x40038000,
+ dev = sysbus_create_varargs(soc_container, "adc",
+ TYPE_STELLARIS_ADC, 0x40038000,
qdev_get_gpio_in(nvic, 14),
qdev_get_gpio_in(nvic, 15),
qdev_get_gpio_in(nvic, 16),
@@ -1157,12 +1156,11 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
if (DEV_CAP(2, GPTM(i))) {
SysBusDevice *sbd;
- dev = qdev_new_orphan(TYPE_STELLARIS_GPTM);
+ dev = qdev_new(soc_container, "gptm[*]", TYPE_STELLARIS_GPTM);
sbd = SYS_BUS_DEVICE(dev);
- object_property_add_child(soc_container, "gptm[*]", OBJECT(dev));
qdev_connect_clock_in(dev, "clk",
qdev_get_clock_out(ssys_dev, "SYSCLK"));
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
sysbus_mmio_map(sbd, 0, 0x40030000 + i * 0x1000);
sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(nvic, timer_irq[i]));
/* TODO: This is incorrect, but we get away with it because
@@ -1172,12 +1170,11 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
}
if (DEV_CAP(1, WDT)) {
- dev = qdev_new_orphan(TYPE_LUMINARY_WATCHDOG);
- object_property_add_child(soc_container, "wdg", OBJECT(dev));
+ dev = qdev_new(soc_container, "wdg", TYPE_LUMINARY_WATCHDOG);
qdev_connect_clock_in(dev, "WDOGCLK",
qdev_get_clock_out(ssys_dev, "SYSCLK"));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev),
0,
0x40000000u);
@@ -1189,7 +1186,8 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
for (i = 0; i < NUM_GPIO; i++) {
if (DEV_CAP(4, GPIO(i))) {
- gpio_dev[i] = sysbus_create_simple_orphan("pl061_luminary", gpio_addr[i],
+ gpio_dev[i] = sysbus_create_simple(soc_container, "gpio[*]",
+ "pl061_luminary", gpio_addr[i],
qdev_get_gpio_in(nvic,
gpio_irq[i]));
for (j = 0; j < 8; j++) {
@@ -1201,7 +1199,8 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
for (i = 0; i < NUM_I2C; i++) {
if (DEV_CAP(2, I2C(i))) {
- i2c_dev[i] = sysbus_create_simple_orphan(TYPE_STELLARIS_I2C, i2c_addr[i],
+ i2c_dev[i] = sysbus_create_simple(soc_container, "i2c[*]",
+ TYPE_STELLARIS_I2C, i2c_addr[i],
qdev_get_gpio_in(nvic,
i2c_irq[i]));
}
@@ -1209,24 +1208,23 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
if (board->peripherals & BP_OLED_I2C) {
I2CBus *bus = (I2CBus *)qdev_get_child_bus(i2c_dev[0], "i2c");
- i2c_slave_create_simple_orphan(bus, "ssd0303", 0x3d);
+ i2c_slave_create_simple(OBJECT(ms), "oled-i2c", bus, "ssd0303", 0x3d);
}
for (i = 0; i < NUM_UART; i++) {
if (DEV_CAP(2, UART(i))) {
SysBusDevice *sbd;
- dev = qdev_new_orphan("pl011_luminary");
- object_property_add_child(soc_container, "uart[*]", OBJECT(dev));
+ dev = qdev_new(soc_container, "uart[*]", "pl011_luminary");
sbd = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(i));
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
sysbus_mmio_map(sbd, 0, 0x4000c000 + i * 0x1000);
sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(nvic, uart_irq[i]));
}
}
if (DEV_CAP(2, SSI)) {
- dev = sysbus_create_simple_orphan("pl022", 0x40008000,
+ dev = sysbus_create_simple(soc_container, "ssi", "pl022", 0x40008000,
qdev_get_gpio_in(nvic, 7));
if (board->peripherals & BP_OLED_SSI) {
void *bus;
@@ -1300,26 +1298,22 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
* - Make the ssd0323 OLED controller chipselect active-low
*/
bus = qdev_get_child_bus(dev, "ssi");
- sddev = ssi_create_peripheral_orphan(bus, "ssi-sd");
+ sddev = ssi_create_peripheral(OBJECT(ms), "ssi-sd", bus, "ssi-sd");
dinfo = drive_get(IF_SD, 0, 0);
blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
- carddev = qdev_new_orphan(TYPE_SD_CARD_SPI);
+ carddev = qdev_new(OBJECT(ms), "sd-card", TYPE_SD_CARD_SPI);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev,
- qdev_get_child_bus(sddev, "sd-bus"),
- &error_fatal);
+ qdev_realize(carddev, qdev_get_child_bus(sddev, "sd-bus"),
+ &error_fatal);
- ssddev = qdev_new_orphan("ssd0323");
- object_property_add_child(OBJECT(ms), "oled", OBJECT(ssddev));
+ ssddev = qdev_new(OBJECT(ms), "oled", "ssd0323");
qdev_prop_set_uint8(ssddev, "cs", 1);
- qdev_realize_and_unref(ssddev, bus, &error_fatal);
+ qdev_realize(ssddev, bus, &error_fatal);
- gpio_d_splitter = qdev_new_orphan(TYPE_SPLIT_IRQ);
- object_property_add_child(OBJECT(ms), "splitter",
- OBJECT(gpio_d_splitter));
+ gpio_d_splitter = qdev_new(OBJECT(ms), "splitter", TYPE_SPLIT_IRQ);
qdev_prop_set_uint32(gpio_d_splitter, "num-lines", 2);
- qdev_realize_and_unref(gpio_d_splitter, NULL, &error_fatal);
+ qdev_realize(gpio_d_splitter, NULL, &error_fatal);
qdev_connect_gpio_out(
gpio_d_splitter, 0,
qdev_get_gpio_in_named(sddev, SSI_GPIO_CS, 0));
@@ -1337,15 +1331,14 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
if (DEV_CAP(4, EMAC)) {
DeviceState *enet;
- enet = qdev_new_orphan("stellaris_enet");
- object_property_add_child(soc_container, "enet", OBJECT(enet));
+ enet = qdev_new(soc_container, "enet", "stellaris_enet");
if (nd) {
qdev_set_nic_properties(enet, nd);
} else {
qdev_prop_set_macaddr(enet, "mac", mac.a);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(enet), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(enet), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(enet), 0, 0x40048000);
sysbus_connect_irq(SYS_BUS_DEVICE(enet), 0, qdev_get_gpio_in(nvic, 42));
}
@@ -1357,13 +1350,12 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
};
DeviceState *gpad;
- gpad = qdev_new_orphan(TYPE_STELLARIS_GAMEPAD);
- object_property_add_child(OBJECT(ms), "gamepad", OBJECT(gpad));
+ gpad = qdev_new(OBJECT(ms), "gamepad", TYPE_STELLARIS_GAMEPAD);
for (i = 0; i < ARRAY_SIZE(gpad_keycode); i++) {
qlist_append_int(gpad_keycode_list, gpad_keycode[i]);
}
qdev_prop_set_array(gpad, "keycodes", gpad_keycode_list);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(gpad), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(gpad), &error_fatal);
qdev_connect_gpio_out(gpad, 0,
qemu_irq_invert(gpio_in[GPIO_E][0])); /* up */
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 064/134] hw/arm/exynos: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (62 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 063/134] hw/arm/stellaris, musicpal: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 065/134] hw/arm/allwinner: " Alexander Graf
` (70 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm exynos
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/exynos4210.c:522 | qdev_new | parent (threaded) | "pl330[*]" | pl330_create() static helper: added Object *parent as first arg, threaded from exynos4210_realize() with OBJECT(s). Paired sysbus_realize_and_unref -> sysbus_realize.
hw/arm/exynos4210.c:603 | sysbus_create_simple | OBJECT(s) | "l2x0" | SoC realize(); s = Exynos4210State being realized.
hw/arm/exynos4210.c:670 | sysbus_create_simple | OBJECT(s) | "pmu" | SoC realize(); single instance.
hw/arm/exynos4210.c:672 | sysbus_create_simple | OBJECT(s) | "clk" | SoC realize(); single instance.
hw/arm/exynos4210.c:673 | sysbus_create_simple | OBJECT(s) | "rng" | SoC realize(); single instance.
hw/arm/exynos4210.c:676 | sysbus_create_varargs | OBJECT(s) | "pwm" | SoC realize(); single instance.
hw/arm/exynos4210.c:684 | sysbus_create_varargs | OBJECT(s) | "rtc" | SoC realize(); single instance.
hw/arm/exynos4210.c:690 | qdev_new | OBJECT(s) | "mct" | SoC realize(); paired sysbus_realize_and_unref -> sysbus_realize.
hw/arm/exynos4210.c:716 | qdev_new | OBJECT(s) | "i2c[*]" | SoC realize(); loop over EXYNOS4210_I2C_NUMBER, auto-index. Paired sysbus_realize_and_unref -> sysbus_realize.
hw/arm/exynos4210.c:760 | qdev_new | OBJECT(s) | "sdhci[*]" | SoC realize(); loop over EXYNOS4210_SDHCI_NUMBER. Paired sysbus_realize_and_unref -> sysbus_realize.
hw/arm/exynos4210.c:770 | qdev_new | OBJECT(s) | "sd-card[*]" | SoC realize(); SD cards owned by SoC (bus is not parent). Paired qdev_realize_and_unref -> qdev_realize.
hw/arm/exynos4210.c:777 | qdev_new | OBJECT(s) | "fimd" | SoC realize(); single instance. Paired sysbus_realize_and_unref -> sysbus_realize.
hw/arm/exynos4210.c:787 | sysbus_create_simple | OBJECT(s) | "ehci" | SoC realize(); single instance.
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/exynos4210.c | 60 +++++++++++++++++++++++++--------------------
1 file changed, 34 insertions(+), 26 deletions(-)
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
index 7d9d87d7ba..74ce36c1e6 100644
--- a/hw/arm/exynos4210.c
+++ b/hw/arm/exynos4210.c
@@ -512,14 +512,15 @@ static uint64_t exynos4210_calc_affinity(int cpu)
return (0x9 << ARM_AFF1_SHIFT) | cpu;
}
-static DeviceState *pl330_create(uint32_t base, OrIRQState *orgate,
- qemu_irq irq, int nreq, int nevents, int width)
+static DeviceState *pl330_create(Object *parent, uint32_t base,
+ OrIRQState *orgate, qemu_irq irq,
+ int nreq, int nevents, int width)
{
SysBusDevice *busdev;
DeviceState *dev;
int i;
- dev = qdev_new_orphan("pl330");
+ dev = qdev_new(parent, "pl330[*]", "pl330");
object_property_set_link(OBJECT(dev), "memory",
OBJECT(get_system_memory()),
&error_fatal);
@@ -534,7 +535,7 @@ static DeviceState *pl330_create(uint32_t base, OrIRQState *orgate,
qdev_prop_set_uint8(dev, "data_width", width);
qdev_prop_set_uint16(dev, "data_buffer_dep", width);
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, base);
object_property_set_int(OBJECT(orgate), "num-lines", nevents + 1,
@@ -600,7 +601,8 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
}
/* Cache controller */
- sysbus_create_simple_orphan("l2x0", EXYNOS4210_L2X0_BASE_ADDR, NULL);
+ sysbus_create_simple(OBJECT(s), "l2x0", "l2x0",
+ EXYNOS4210_L2X0_BASE_ADDR, NULL);
/* External GIC */
qdev_prop_set_uint32(DEVICE(&s->ext_gic), "num-cpu", EXYNOS4210_NCPUS);
@@ -667,13 +669,17 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
* The only reason of existence at the moment is that secondary CPU boot
* loader uses PMU INFORM5 register as a holding pen.
*/
- sysbus_create_simple_orphan("exynos4210.pmu", EXYNOS4210_PMU_BASE_ADDR, NULL);
+ sysbus_create_simple(OBJECT(s), "pmu", "exynos4210.pmu",
+ EXYNOS4210_PMU_BASE_ADDR, NULL);
- sysbus_create_simple_orphan("exynos4210.clk", EXYNOS4210_CLK_BASE_ADDR, NULL);
- sysbus_create_simple_orphan("exynos4210.rng", EXYNOS4210_RNG_BASE_ADDR, NULL);
+ sysbus_create_simple(OBJECT(s), "clk", "exynos4210.clk",
+ EXYNOS4210_CLK_BASE_ADDR, NULL);
+ sysbus_create_simple(OBJECT(s), "rng", "exynos4210.rng",
+ EXYNOS4210_RNG_BASE_ADDR, NULL);
/* PWM */
- sysbus_create_varargs_orphan("exynos4210.pwm", EXYNOS4210_PWM_BASE_ADDR,
+ sysbus_create_varargs(OBJECT(s), "pwm", "exynos4210.pwm",
+ EXYNOS4210_PWM_BASE_ADDR,
s->irq_table[exynos4210_get_irq(22, 0)],
s->irq_table[exynos4210_get_irq(22, 1)],
s->irq_table[exynos4210_get_irq(22, 2)],
@@ -681,15 +687,16 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
s->irq_table[exynos4210_get_irq(22, 4)],
NULL);
/* RTC */
- sysbus_create_varargs_orphan("exynos4210.rtc", EXYNOS4210_RTC_BASE_ADDR,
+ sysbus_create_varargs(OBJECT(s), "rtc", "exynos4210.rtc",
+ EXYNOS4210_RTC_BASE_ADDR,
s->irq_table[exynos4210_get_irq(23, 0)],
s->irq_table[exynos4210_get_irq(23, 1)],
NULL);
/* Multi Core Timer */
- dev = qdev_new_orphan("exynos4210.mct");
+ dev = qdev_new(OBJECT(s), "mct", "exynos4210.mct");
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
for (n = 0; n < 4; n++) {
/* Connect global timer interrupts to Combiner gpio_in */
sysbus_connect_irq(busdev, n,
@@ -713,9 +720,9 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
i2c_irq = s->irq_table[exynos4210_get_irq(EXYNOS4210_HDMI_INTG, 1)];
}
- dev = qdev_new_orphan("exynos4210.i2c");
+ dev = qdev_new(OBJECT(s), "i2c[*]", "exynos4210.i2c");
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_connect_irq(busdev, 0, i2c_irq);
sysbus_mmio_map(busdev, 0, addr);
s->i2c_if[n] = (I2CBus *)qdev_get_child_bus(dev, "i2c");
@@ -757,46 +764,47 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
* public datasheet which is very similar (implementing
* MMC Specification Version 4.0 being the only difference noted)
*/
- dev = qdev_new_orphan(TYPE_S3C_SDHCI);
+ dev = qdev_new(OBJECT(s), "sdhci[*]", TYPE_S3C_SDHCI);
qdev_prop_set_uint64(dev, "capareg", EXYNOS4210_SDHCI_CAPABILITIES);
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, EXYNOS4210_SDHCI_ADDR(n));
sysbus_connect_irq(busdev, 0, s->irq_table[exynos4210_get_irq(29, n)]);
di = drive_get(IF_SD, 0, n);
blk = di ? blk_by_legacy_dinfo(di) : NULL;
- carddev = qdev_new_orphan(TYPE_SD_CARD);
+ carddev = qdev_new(OBJECT(s), "sd-card[*]", TYPE_SD_CARD);
qdev_prop_set_drive(carddev, "drive", blk);
- qdev_realize_and_unref(carddev, qdev_get_child_bus(dev, "sd-bus"),
- &error_fatal);
+ qdev_realize(carddev, qdev_get_child_bus(dev, "sd-bus"),
+ &error_fatal);
}
/*** Display controller (FIMD) ***/
- dev = qdev_new_orphan("exynos4210.fimd");
+ dev = qdev_new(OBJECT(s), "fimd", "exynos4210.fimd");
object_property_set_link(OBJECT(dev), "framebuffer-memory",
OBJECT(system_mem), &error_fatal);
busdev = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_mmio_map(busdev, 0, EXYNOS4210_FIMD0_BASE_ADDR);
for (n = 0; n < 3; n++) {
sysbus_connect_irq(busdev, n, s->irq_table[exynos4210_get_irq(11, n)]);
}
- sysbus_create_simple_orphan(TYPE_EXYNOS4210_EHCI, EXYNOS4210_EHCI_BASE_ADDR,
- s->irq_table[exynos4210_get_irq(28, 3)]);
+ sysbus_create_simple(OBJECT(s), "ehci", TYPE_EXYNOS4210_EHCI,
+ EXYNOS4210_EHCI_BASE_ADDR,
+ s->irq_table[exynos4210_get_irq(28, 3)]);
/*** DMA controllers ***/
- pl330[0] = pl330_create(EXYNOS4210_PL330_BASE0_ADDR,
+ pl330[0] = pl330_create(OBJECT(s), EXYNOS4210_PL330_BASE0_ADDR,
&s->pl330_irq_orgate[0],
s->irq_table[exynos4210_get_irq(21, 0)],
32, 32, 32);
- pl330[1] = pl330_create(EXYNOS4210_PL330_BASE1_ADDR,
+ pl330[1] = pl330_create(OBJECT(s), EXYNOS4210_PL330_BASE1_ADDR,
&s->pl330_irq_orgate[1],
s->irq_table[exynos4210_get_irq(21, 1)],
32, 32, 32);
- pl330[2] = pl330_create(EXYNOS4210_PL330_BASE2_ADDR,
+ pl330[2] = pl330_create(OBJECT(s), EXYNOS4210_PL330_BASE2_ADDR,
&s->pl330_irq_orgate[2],
s->irq_table[exynos4210_get_irq(20, 1)],
1, 31, 64);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 065/134] hw/arm/allwinner: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (63 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 064/134] hw/arm/exynos: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:35 ` [RFC PATCH 066/134] hw/arm/strongarm: " Alexander Graf
` (69 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm allwinner
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/allwinner-h3.c:382 | sysbus_create_simple | OBJECT(s) | "ehci[*]" | allwinner_h3_realize() SoC realize; 4 instances, auto-index.
hw/arm/allwinner-h3.c:385 | sysbus_create_simple | OBJECT(s) | "ehci[*]" | SoC realize; auto-index.
hw/arm/allwinner-h3.c:388 | sysbus_create_simple | OBJECT(s) | "ehci[*]" | SoC realize; auto-index.
hw/arm/allwinner-h3.c:391 | sysbus_create_simple | OBJECT(s) | "ehci[*]" | SoC realize; auto-index.
hw/arm/allwinner-h3.c:395 | sysbus_create_simple | OBJECT(s) | "ohci[*]" | SoC realize; 4 instances, auto-index.
hw/arm/allwinner-h3.c:398 | sysbus_create_simple | OBJECT(s) | "ohci[*]" | SoC realize; auto-index.
hw/arm/allwinner-h3.c:401 | sysbus_create_simple | OBJECT(s) | "ohci[*]" | SoC realize; auto-index.
hw/arm/allwinner-h3.c:404 | sysbus_create_simple | OBJECT(s) | "ohci[*]" | SoC realize; auto-index.
hw/arm/bananapi_m2u.c:53 | qdev_new | OBJECT(s) | "sd-card[*]" | mmc_attach_drive() helper receives AwR40State *s (SoC, itself child of machine); use it as parent. Multiple units -> auto-index. Paired qdev_realize_and_unref -> qdev_realize.
hw/arm/bananapi_m2u.c:117 | i2c_slave_create_simple | OBJECT(machine) | "axp221" | Board init(); PMU is board-level peripheral on i2c bus.
hw/arm/cubieboard.c:84 | i2c_slave_create_simple | OBJECT(machine) | "axp209" | Board init(); PMU is board-level peripheral.
hw/arm/cubieboard.c:92 | qdev_new | OBJECT(machine) | "sd-card" | Board init(); single SD card. Paired qdev_realize_and_unref -> qdev_realize.
hw/arm/orangepi.c:88 | qdev_new | OBJECT(machine) | "sd-card" | Board init(); single SD card. Paired qdev_realize_and_unref -> qdev_realize.
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/allwinner-h3.c | 24 ++++++++++++++++--------
hw/arm/bananapi_m2u.c | 6 +++---
hw/arm/cubieboard.c | 6 +++---
hw/arm/orangepi.c | 4 ++--
4 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/hw/arm/allwinner-h3.c b/hw/arm/allwinner-h3.c
index ce716d1687..6f9a07610f 100644
--- a/hw/arm/allwinner-h3.c
+++ b/hw/arm/allwinner-h3.c
@@ -379,29 +379,37 @@ static void allwinner_h3_realize(DeviceState *dev, Error **errp)
qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_EMAC));
/* Universal Serial Bus */
- sysbus_create_simple_orphan(TYPE_AW_H3_EHCI, s->memmap[AW_H3_DEV_EHCI0],
+ sysbus_create_simple(OBJECT(s), "ehci[*]", TYPE_AW_H3_EHCI,
+ s->memmap[AW_H3_DEV_EHCI0],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_EHCI0));
- sysbus_create_simple_orphan(TYPE_AW_H3_EHCI, s->memmap[AW_H3_DEV_EHCI1],
+ sysbus_create_simple(OBJECT(s), "ehci[*]", TYPE_AW_H3_EHCI,
+ s->memmap[AW_H3_DEV_EHCI1],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_EHCI1));
- sysbus_create_simple_orphan(TYPE_AW_H3_EHCI, s->memmap[AW_H3_DEV_EHCI2],
+ sysbus_create_simple(OBJECT(s), "ehci[*]", TYPE_AW_H3_EHCI,
+ s->memmap[AW_H3_DEV_EHCI2],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_EHCI2));
- sysbus_create_simple_orphan(TYPE_AW_H3_EHCI, s->memmap[AW_H3_DEV_EHCI3],
+ sysbus_create_simple(OBJECT(s), "ehci[*]", TYPE_AW_H3_EHCI,
+ s->memmap[AW_H3_DEV_EHCI3],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_EHCI3));
- sysbus_create_simple_orphan("sysbus-ohci", s->memmap[AW_H3_DEV_OHCI0],
+ sysbus_create_simple(OBJECT(s), "ohci[*]", "sysbus-ohci",
+ s->memmap[AW_H3_DEV_OHCI0],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_OHCI0));
- sysbus_create_simple_orphan("sysbus-ohci", s->memmap[AW_H3_DEV_OHCI1],
+ sysbus_create_simple(OBJECT(s), "ohci[*]", "sysbus-ohci",
+ s->memmap[AW_H3_DEV_OHCI1],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_OHCI1));
- sysbus_create_simple_orphan("sysbus-ohci", s->memmap[AW_H3_DEV_OHCI2],
+ sysbus_create_simple(OBJECT(s), "ohci[*]", "sysbus-ohci",
+ s->memmap[AW_H3_DEV_OHCI2],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_OHCI2));
- sysbus_create_simple_orphan("sysbus-ohci", s->memmap[AW_H3_DEV_OHCI3],
+ sysbus_create_simple(OBJECT(s), "ohci[*]", "sysbus-ohci",
+ s->memmap[AW_H3_DEV_OHCI3],
qdev_get_gpio_in(DEVICE(&s->gic),
AW_H3_GIC_SPI_OHCI3));
diff --git a/hw/arm/bananapi_m2u.c b/hw/arm/bananapi_m2u.c
index 809c8bbc43..ae2d8bd2f7 100644
--- a/hw/arm/bananapi_m2u.c
+++ b/hw/arm/bananapi_m2u.c
@@ -50,9 +50,9 @@ static void mmc_attach_drive(AwR40State *s, AwSdHostState *mmc, int unit,
exit(1);
}
- carddev = qdev_new_orphan(TYPE_SD_CARD);
+ carddev = qdev_new(OBJECT(s), "sd-card[*]", TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev, bus, &error_fatal);
+ qdev_realize(carddev, bus, &error_fatal);
if (load_bootroom && blk && blk_is_available(blk)) {
/* Use Boot ROM to copy data from SD card to SRAM */
@@ -114,7 +114,7 @@ static void bpim2u_init(MachineState *machine)
/* Connect AXP221 */
i2c = I2C_BUS(qdev_get_child_bus(DEVICE(&r40->i2c0), "i2c"));
- i2c_slave_create_simple_orphan(i2c, "axp221_pmu", 0x34);
+ i2c_slave_create_simple(OBJECT(machine), "axp221", i2c, "axp221_pmu", 0x34);
/* SDRAM */
memory_region_add_subregion(get_system_memory(),
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index 7ce5179345..fa5eaa5378 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -81,7 +81,7 @@ static void cubieboard_init(MachineState *machine)
/* Connect AXP 209 */
i2c = I2C_BUS(qdev_get_child_bus(DEVICE(&a10->i2c0), "i2c"));
- i2c_slave_create_simple_orphan(i2c, "axp209_pmu", 0x34);
+ i2c_slave_create_simple(OBJECT(machine), "axp209", i2c, "axp209_pmu", 0x34);
/* Retrieve SD bus */
di = drive_get(IF_SD, 0, 0);
@@ -89,9 +89,9 @@ static void cubieboard_init(MachineState *machine)
bus = qdev_get_child_bus(DEVICE(a10), "sd-bus");
/* Plug in SD card */
- carddev = qdev_new_orphan(TYPE_SD_CARD);
+ carddev = qdev_new(OBJECT(machine), "sd-card", TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev, bus, &error_fatal);
+ qdev_realize(carddev, bus, &error_fatal);
memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE,
machine->ram);
diff --git a/hw/arm/orangepi.c b/hw/arm/orangepi.c
index d705cc43b4..1a37c97eef 100644
--- a/hw/arm/orangepi.c
+++ b/hw/arm/orangepi.c
@@ -85,9 +85,9 @@ static void orangepi_init(MachineState *machine)
bus = qdev_get_child_bus(DEVICE(h3), "sd-bus");
/* Plug in SD card */
- carddev = qdev_new_orphan(TYPE_SD_CARD);
+ carddev = qdev_new(OBJECT(machine), "sd-card", TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev, bus, &error_fatal);
+ qdev_realize(carddev, bus, &error_fatal);
/* SDRAM */
memory_region_add_subregion(get_system_memory(), h3->memmap[AW_H3_DEV_SDRAM],
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 066/134] hw/arm/strongarm: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (64 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 065/134] hw/arm/allwinner: " Alexander Graf
@ 2026-07-11 22:35 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 067/134] hw/arm/omap: " Alexander Graf
` (68 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:35 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm strongarm
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/collie.c:67 | sysbus_create_simple | OBJECT(machine) | "scoop" | Board .init(MachineState *machine); single instance.
hw/arm/strongarm.c:649 | qdev_new | parent (threaded) | "gpio" | strongarm_gpio_init() static helper: added Object *parent as first arg, threaded from sa1110_init(). Paired sysbus_realize_and_unref -> sysbus_realize.
hw/arm/strongarm.c:1623 | cpu_create | parent (threaded) | "cpu" | sa1110_init() has no parent-capable pointer; added Object *parent as first arg (prototype in strongarm.h updated), threaded from collie_init() with OBJECT(machine).
hw/arm/strongarm.c:1625 | sysbus_create_varargs | parent | "pic" | sa1110_init(); single PIC.
hw/arm/strongarm.c:1630 | sysbus_create_varargs | parent | "timer" | sa1110_init(); single timer.
hw/arm/strongarm.c:1637 | sysbus_create_simple | parent | "rtc" | sa1110_init(); single RTC.
hw/arm/strongarm.c:1642 | sysbus_create_varargs | parent | "ppc" | sa1110_init(); single PPC.
hw/arm/strongarm.c:1645 | qdev_new | parent | "uart[*]" | sa1110_init(); loop over sa_serial[]. Paired sysbus_realize_and_unref -> sysbus_realize.
hw/arm/strongarm.c:1654 | sysbus_create_varargs | parent | "ssp" | sa1110_init(); single SSP.
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/collie.c | 4 ++--
hw/arm/strongarm.c | 27 ++++++++++++++-------------
hw/arm/strongarm.h | 2 +-
3 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
index b3646daa3b..afd4e14315 100644
--- a/hw/arm/collie.c
+++ b/hw/arm/collie.c
@@ -52,7 +52,7 @@ static void collie_init(MachineState *machine)
exit(EXIT_FAILURE);
}
- cms->sa1110 = sa1110_init(machine->cpu_type);
+ cms->sa1110 = sa1110_init(OBJECT(machine), machine->cpu_type);
memory_region_add_subregion(get_system_memory(), SA_SDCS0, machine->ram);
@@ -64,7 +64,7 @@ static void collie_init(MachineState *machine)
FLASH_SECTOR_SIZE, 4, 0x00, 0x00, 0x00, 0x00, 0);
}
- sysbus_create_simple_orphan("scoop", 0x40800000, NULL);
+ sysbus_create_simple(OBJECT(machine), "scoop", "scoop", 0x40800000, NULL);
collie_binfo.board_id = 0x208;
arm_load_kernel(cms->sa1110->cpu, machine, &collie_binfo);
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
index 1704db8baa..0b3b56218a 100644
--- a/hw/arm/strongarm.c
+++ b/hw/arm/strongarm.c
@@ -640,14 +640,14 @@ static const MemoryRegionOps strongarm_gpio_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
-static DeviceState *strongarm_gpio_init(hwaddr base,
+static DeviceState *strongarm_gpio_init(Object *parent, hwaddr base,
DeviceState *pic)
{
DeviceState *dev;
int i;
- dev = qdev_new_orphan(TYPE_STRONGARM_GPIO);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ dev = qdev_new(parent, "gpio", TYPE_STRONGARM_GPIO);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
for (i = 0; i < 12; i++)
@@ -1608,7 +1608,7 @@ static const TypeInfo strongarm_ssp_info = {
};
/* Main CPU functions */
-StrongARMState *sa1110_init(const char *cpu_type)
+StrongARMState *sa1110_init(Object *parent, const char *cpu_type)
{
StrongARMState *s;
int i;
@@ -1620,38 +1620,39 @@ StrongARMState *sa1110_init(const char *cpu_type)
exit(1);
}
- s->cpu = ARM_CPU(cpu_create_orphan(cpu_type));
+ s->cpu = ARM_CPU(cpu_create(parent, "cpu", cpu_type));
- s->pic = sysbus_create_varargs_orphan("strongarm_pic", 0x90050000,
+ s->pic = sysbus_create_varargs(parent, "pic", "strongarm_pic", 0x90050000,
qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_IRQ),
qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_FIQ),
NULL);
- sysbus_create_varargs_orphan("pxa25x-timer", 0x90000000,
+ sysbus_create_varargs(parent, "timer", "pxa25x-timer", 0x90000000,
qdev_get_gpio_in(s->pic, SA_PIC_OSTC0),
qdev_get_gpio_in(s->pic, SA_PIC_OSTC1),
qdev_get_gpio_in(s->pic, SA_PIC_OSTC2),
qdev_get_gpio_in(s->pic, SA_PIC_OSTC3),
NULL);
- sysbus_create_simple_orphan(TYPE_STRONGARM_RTC, 0x90010000,
+ sysbus_create_simple(parent, "rtc", TYPE_STRONGARM_RTC, 0x90010000,
qdev_get_gpio_in(s->pic, SA_PIC_RTC_ALARM));
- s->gpio = strongarm_gpio_init(0x90040000, s->pic);
+ s->gpio = strongarm_gpio_init(parent, 0x90040000, s->pic);
- s->ppc = sysbus_create_varargs_orphan(TYPE_STRONGARM_PPC, 0x90060000, NULL);
+ s->ppc = sysbus_create_varargs(parent, "ppc", TYPE_STRONGARM_PPC,
+ 0x90060000, NULL);
for (i = 0; sa_serial[i].io_base; i++) {
- DeviceState *dev = qdev_new_orphan(TYPE_STRONGARM_UART);
+ DeviceState *dev = qdev_new(parent, "uart[*]", TYPE_STRONGARM_UART);
qdev_prop_set_chr(dev, "chardev", serial_hd(i));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0,
sa_serial[i].io_base);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
qdev_get_gpio_in(s->pic, sa_serial[i].irq));
}
- s->ssp = sysbus_create_varargs_orphan(TYPE_STRONGARM_SSP, 0x80070000,
+ s->ssp = sysbus_create_varargs(parent, "ssp", TYPE_STRONGARM_SSP, 0x80070000,
qdev_get_gpio_in(s->pic, SA_PIC_SSP), NULL);
s->ssp_bus = (SSIBus *)qdev_get_child_bus(s->ssp, "ssi");
diff --git a/hw/arm/strongarm.h b/hw/arm/strongarm.h
index b11b3a3379..72bb9e075c 100644
--- a/hw/arm/strongarm.h
+++ b/hw/arm/strongarm.h
@@ -62,6 +62,6 @@ typedef struct {
SSIBus *ssp_bus;
} StrongARMState;
-StrongARMState *sa1110_init(const char *cpu_type);
+StrongARMState *sa1110_init(Object *parent, const char *cpu_type);
#endif
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 067/134] hw/arm/omap: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (65 preceding siblings ...)
2026-07-11 22:35 ` [RFC PATCH 066/134] hw/arm/strongarm: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 068/134] hw/arm/mps2: " Alexander Graf
` (67 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm omap
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/omap1.c:3752 | cpu_create | parent | "cpu" | omap310_mpu_init() already receives Object *parent; use it directly.
hw/arm/omap1.c:3766 | qdev_new | parent | "intc[0]" | Two interrupt controllers, explicit index. Paired sysbus_realize_and_unref -> sysbus_realize.
hw/arm/omap1.c:3776 | qdev_new | parent | "intc[1]" | Second intc. Paired sysbus_realize_and_unref -> sysbus_realize.
hw/arm/omap1.c:3879 | qdev_new | parent | "mmc" | Single MMC. Paired sysbus_realize_and_unref -> sysbus_realize.
hw/arm/omap1.c:3891 | qdev_new | parent | "sd-card" | Single SD card (bus is not parent). Paired qdev_realize_and_unref -> qdev_realize.
hw/arm/omap1.c:3903 | qdev_new | parent | "gpio" | Single GPIO. Paired sysbus_realize_and_unref -> sysbus_realize.
hw/arm/omap1.c:3920 | qdev_new | parent | "i2c" | Single i2c (only i2c[0] populated on omap1). Paired sysbus_realize_and_unref -> sysbus_realize.
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/omap1.c | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index c86914a464..e5e092e074 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -3749,7 +3749,7 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
MemoryRegion *system_memory = get_system_memory();
/* Core */
- s->cpu = ARM_CPU(cpu_create_orphan(cpu_type));
+ s->cpu = ARM_CPU(cpu_create(parent, "cpu", cpu_type));
s->sdram_size = memory_region_size(dram);
s->sram_size = OMAP15XX_SRAM_SIZE;
@@ -3763,21 +3763,21 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
omap_clkm_init(system_memory, 0xfffece00, 0xe1008000, s);
- s->ih[0] = qdev_new_orphan("omap-intc");
+ s->ih[0] = qdev_new(parent, "intc[0]", "omap-intc");
qdev_prop_set_uint32(s->ih[0], "size", 0x100);
omap_intc_set_iclk(OMAP_INTC(s->ih[0]), omap_findclk(s, "arminth_ck"));
busdev = SYS_BUS_DEVICE(s->ih[0]);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_connect_irq(busdev, 0,
qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_IRQ));
sysbus_connect_irq(busdev, 1,
qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_FIQ));
sysbus_mmio_map(busdev, 0, 0xfffecb00);
- s->ih[1] = qdev_new_orphan("omap-intc");
+ s->ih[1] = qdev_new(parent, "intc[1]", "omap-intc");
qdev_prop_set_uint32(s->ih[1], "size", 0x800);
omap_intc_set_iclk(OMAP_INTC(s->ih[1]), omap_findclk(s, "arminth_ck"));
busdev = SYS_BUS_DEVICE(s->ih[1]);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_connect_irq(busdev, 0,
qdev_get_gpio_in(s->ih[0], OMAP_INT_15XX_IH2_IRQ));
/* The second interrupt controller's FIQ output is not wired up */
@@ -3876,8 +3876,8 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
warn_report("missing SecureDigital device");
}
- s->mmc = qdev_new_orphan(TYPE_OMAP_MMC);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(s->mmc), &error_fatal);
+ s->mmc = qdev_new(parent, "mmc", TYPE_OMAP_MMC);
+ sysbus_realize(SYS_BUS_DEVICE(s->mmc), &error_fatal);
omap_mmc_set_clk(s->mmc, omap_findclk(s, "mmc_ck"));
memory_region_add_subregion(system_memory, 0xfffb7800,
@@ -3888,11 +3888,11 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
qdev_get_gpio_in(s->ih[1], OMAP_INT_OQN));
if (dinfo) {
- DeviceState *card = qdev_new_orphan(TYPE_SD_CARD);
+ DeviceState *card = qdev_new(parent, "sd-card", TYPE_SD_CARD);
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
- qdev_realize_and_unref(card, qdev_get_child_bus(s->mmc, "sd-bus"),
- &error_fatal);
+ qdev_realize(card, qdev_get_child_bus(s->mmc, "sd-bus"),
+ &error_fatal);
}
s->mpuio = omap_mpuio_init(system_memory, 0xfffb5000,
@@ -3900,9 +3900,9 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
qdev_get_gpio_in(s->ih[1], OMAP_INT_MPUIO),
omap_findclk(s, "clk32-kHz"));
- s->gpio = qdev_new_orphan("omap-gpio");
+ s->gpio = qdev_new(parent, "gpio", "omap-gpio");
omap_gpio_set_clk(OMAP1_GPIO(s->gpio), omap_findclk(s, "arm_gpio_ck"));
- sysbus_realize_and_unref(SYS_BUS_DEVICE(s->gpio), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(s->gpio), &error_fatal);
sysbus_connect_irq(SYS_BUS_DEVICE(s->gpio), 0,
qdev_get_gpio_in(s->ih[0], OMAP_INT_GPIO_BANK1));
sysbus_mmio_map(SYS_BUS_DEVICE(s->gpio), 0, 0xfffce000);
@@ -3917,11 +3917,11 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
s->pwt = omap_pwt_init(system_memory, 0xfffb6000,
omap_findclk(s, "armxor_ck"));
- s->i2c[0] = qdev_new_orphan("omap_i2c");
+ s->i2c[0] = qdev_new(parent, "i2c", "omap_i2c");
qdev_prop_set_uint8(s->i2c[0], "revision", 0x11);
omap_i2c_set_fclk(OMAP_I2C(s->i2c[0]), omap_findclk(s, "mpuper_ck"));
busdev = SYS_BUS_DEVICE(s->i2c[0]);
- sysbus_realize_and_unref(busdev, &error_fatal);
+ sysbus_realize(busdev, &error_fatal);
sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(s->ih[1], OMAP_INT_I2C));
sysbus_connect_irq(busdev, 1, s->drq[OMAP_DMA_I2C_TX]);
sysbus_connect_irq(busdev, 2, s->drq[OMAP_DMA_I2C_RX]);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 068/134] hw/arm/mps2: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (66 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 067/134] hw/arm/omap: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 069/134] hw/arm/imx: " Alexander Graf
` (66 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm mps2
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/mps2.c:302 | qdev_new_orphan | OBJECT(mms) | "uart[*]" | board init (mps2_common_init), MPS2MachineState *mms is machine; indexed loop; drop _and_unref
hw/arm/mps2.c:346 | qdev_new_orphan | OBJECT(mms) | "uart[*]" | board init, second FPGA variant loop; auto-index; drop _and_unref
hw/arm/mps2.c:419 | sysbus_create_simple_orphan | OBJECT(mms) | "spi[*]" | board init; PL022 external ADC; auto-index shared with loop below
hw/arm/mps2.c:438 | sysbus_create_simple_orphan | OBJECT(mms) | "spi[*]" | board init; PL022 in nested loop; auto-index
hw/arm/mps2.c:449 | sysbus_create_simple_orphan | OBJECT(mms) | "i2c[*]" | board init; SBCON I2C in loop; auto-index
hw/arm/mps2-tz.c:511 | qdev_new_orphan | OBJECT(mms) | "lan9118" | make_eth_dev helper receives MPS2TZMachineState *mms (board state); single instance; drop _and_unref
hw/arm/mps2-tz.c:538 | qdev_new_orphan | OBJECT(mms) | "lan9118" | make_eth_usb helper receives mms; single instance (mutually exclusive with make_eth_dev per board); drop _and_unref
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/mps2-tz.c | 8 ++++----
hw/arm/mps2.c | 18 ++++++++++--------
2 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
index c0ab898f2e..17945d2b71 100644
--- a/hw/arm/mps2-tz.c
+++ b/hw/arm/mps2-tz.c
@@ -508,11 +508,11 @@ static MemoryRegion *make_eth_dev(MPS2TZMachineState *mms, void *opaque,
/* In hardware this is a LAN9220; the LAN9118 is software compatible
* except that it doesn't support the checksum-offload feature.
*/
- mms->lan9118 = qdev_new_orphan(TYPE_LAN9118);
+ mms->lan9118 = qdev_new(OBJECT(mms), "lan9118", TYPE_LAN9118);
qemu_configure_nic_device(mms->lan9118, true, NULL);
s = SYS_BUS_DEVICE(mms->lan9118);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_connect_irq(s, 0, get_sse_irq_in(mms, irqs[0]));
return sysbus_mmio_get_region(s, 0);
}
@@ -535,11 +535,11 @@ static MemoryRegion *make_eth_usb(MPS2TZMachineState *mms, void *opaque,
* In hardware this is a LAN9220; the LAN9118 is software compatible
* except that it doesn't support the checksum-offload feature.
*/
- mms->lan9118 = qdev_new_orphan(TYPE_LAN9118);
+ mms->lan9118 = qdev_new(OBJECT(mms), "lan9118", TYPE_LAN9118);
qemu_configure_nic_device(mms->lan9118, true, NULL);
s = SYS_BUS_DEVICE(mms->lan9118);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_connect_irq(s, 0, get_sse_irq_in(mms, irqs[0]));
memory_region_add_subregion(&mms->eth_usb_container,
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
index e646c7c71e..2edd222674 100644
--- a/hw/arm/mps2.c
+++ b/hw/arm/mps2.c
@@ -299,11 +299,11 @@ static void mps2_common_init(MachineState *machine)
rxovrint = qdev_get_gpio_in(orgate_dev, i * 2 + 1);
}
- dev = qdev_new_orphan(TYPE_CMSDK_APB_UART);
+ dev = qdev_new(OBJECT(mms), "uart[*]", TYPE_CMSDK_APB_UART);
s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(i));
qdev_prop_set_uint32(dev, "pclk-frq", SYSCLK_FRQ);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, uartbase[i]);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(armv7m, uartirq[i] + 1));
sysbus_connect_irq(s, 1, qdev_get_gpio_in(armv7m, uartirq[i]));
@@ -343,11 +343,11 @@ static void mps2_common_init(MachineState *machine)
qdev_connect_gpio_out(txrx_orgate_dev, 0,
qdev_get_gpio_in(armv7m, uart_txrx_irqno[i]));
- dev = qdev_new_orphan(TYPE_CMSDK_APB_UART);
+ dev = qdev_new(OBJECT(mms), "uart[*]", TYPE_CMSDK_APB_UART);
s = SYS_BUS_DEVICE(dev);
qdev_prop_set_chr(dev, "chardev", serial_hd(i));
qdev_prop_set_uint32(dev, "pclk-frq", SYSCLK_FRQ);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, uartbase[i]);
sysbus_connect_irq(s, 0, qdev_get_gpio_in(txrx_orgate_dev, 0));
sysbus_connect_irq(s, 1, qdev_get_gpio_in(txrx_orgate_dev, 1));
@@ -416,8 +416,8 @@ static void mps2_common_init(MachineState *machine)
qdev_prop_set_uint32(DEVICE(&mms->fpgaio), "prescale-clk", 25000000);
sysbus_realize(SYS_BUS_DEVICE(&mms->fpgaio), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(&mms->fpgaio), 0, 0x40028000);
- sysbus_create_simple_orphan(TYPE_PL022, 0x40025000, /* External ADC */
- qdev_get_gpio_in(armv7m, 22));
+ sysbus_create_simple(OBJECT(mms), "spi[*]", TYPE_PL022, 0x40025000,
+ qdev_get_gpio_in(armv7m, 22)); /* External ADC */
for (i = 0; i < 2; i++) {
static const int spi_irqno[] = {11, 24};
static const hwaddr spibase[] = {0x40020000, /* APB */
@@ -435,7 +435,8 @@ static void mps2_common_init(MachineState *machine)
qdev_connect_gpio_out(orgate_dev, 0,
qdev_get_gpio_in(armv7m, spi_irqno[i]));
for (j = 0; j < 2; j++) {
- sysbus_create_simple_orphan(TYPE_PL022, spibase[2 * i + j],
+ sysbus_create_simple(OBJECT(mms), "spi[*]", TYPE_PL022,
+ spibase[2 * i + j],
qdev_get_gpio_in(orgate_dev, j));
}
}
@@ -446,7 +447,8 @@ static void mps2_common_init(MachineState *machine)
0x4002a000}; /* Shield1 */
DeviceState *dev;
- dev = sysbus_create_simple_orphan(TYPE_ARM_SBCON_I2C, i2cbase[i], NULL);
+ dev = sysbus_create_simple(OBJECT(mms), "i2c[*]",
+ TYPE_ARM_SBCON_I2C, i2cbase[i], NULL);
if (i < 2) {
/*
* internal-only bus: mark it full to avoid user-created
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 069/134] hw/arm/imx: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (67 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 068/134] hw/arm/mps2: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 070/134] hw/arm/misc: " Alexander Graf
` (65 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm imx
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/fsl-imx6.c:171 | sysbus_create_simple_orphan | OBJECT(dev) | "l2x0" | SoC DeviceClass.realize(DeviceState *dev); parent is the SoC device being realized; single instance
hw/arm/imx25_pdk.c:130 | qdev_new_orphan | OBJECT(machine) | "sd-card[*]" | board init(MachineState *machine); loop over ESDHC slots; auto-index; drop _and_unref
hw/arm/imx8mm-evk.c:100 | qdev_new_orphan | OBJECT(machine) | "sd-card[*]" | board init; loop over USDHC slots; auto-index; drop _and_unref
hw/arm/imx8mp-evk.c:113 | qdev_new_orphan | OBJECT(machine) | "sd-card[*]" | board init; loop over USDHC slots; auto-index; drop _and_unref
hw/arm/mcimx6ul-evk.c:62 | qdev_new_orphan | OBJECT(machine) | "sd-card[*]" | board init; loop over USDHC slots; auto-index; drop _and_unref
hw/arm/mcimx7d-sabre.c:62 | qdev_new_orphan | OBJECT(machine) | "sd-card[*]" | board init; loop over USDHC slots; auto-index; drop _and_unref
hw/arm/sabrelite.c:99 | qdev_new_orphan | OBJECT(machine) | "spi-flash" | board init; single NOR flash on SPI bus; drop _and_unref
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/fsl-imx6.c | 3 ++-
hw/arm/imx25_pdk.c | 4 ++--
hw/arm/imx8mm-evk.c | 4 ++--
hw/arm/imx8mp-evk.c | 4 ++--
hw/arm/mcimx6ul-evk.c | 4 ++--
hw/arm/mcimx7d-sabre.c | 4 ++--
hw/arm/sabrelite.c | 5 +++--
7 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index 103adcc2bd..44046953be 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -168,7 +168,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
}
/* L2 cache controller */
- sysbus_create_simple_orphan("l2x0", FSL_IMX6_PL310_ADDR, NULL);
+ sysbus_create_simple(OBJECT(dev), "l2x0", "l2x0", FSL_IMX6_PL310_ADDR,
+ NULL);
if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
return;
diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c
index 6976652370..9351d53850 100644
--- a/hw/arm/imx25_pdk.c
+++ b/hw/arm/imx25_pdk.c
@@ -127,9 +127,9 @@ static void imx25_pdk_init(MachineState *machine)
di = drive_get(IF_SD, 0, i);
blk = di ? blk_by_legacy_dinfo(di) : NULL;
bus = qdev_get_child_bus(DEVICE(&s->soc.esdhc[i]), "sd-bus");
- carddev = qdev_new_orphan(TYPE_SD_CARD);
+ carddev = qdev_new(OBJECT(machine), "sd-card[*]", TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev, bus, &error_fatal);
+ qdev_realize(carddev, bus, &error_fatal);
}
/*
diff --git a/hw/arm/imx8mm-evk.c b/hw/arm/imx8mm-evk.c
index ce7693ca7a..72fa1930ae 100644
--- a/hw/arm/imx8mm-evk.c
+++ b/hw/arm/imx8mm-evk.c
@@ -97,9 +97,9 @@ static void imx8mm_evk_init(MachineState *machine)
blk = blk_by_legacy_dinfo(di);
bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
- carddev = qdev_new_orphan(TYPE_SD_CARD);
+ carddev = qdev_new(OBJECT(machine), "sd-card[*]", TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev, bus, &error_fatal);
+ qdev_realize(carddev, bus, &error_fatal);
}
if (!qtest_enabled()) {
diff --git a/hw/arm/imx8mp-evk.c b/hw/arm/imx8mp-evk.c
index 90cda63b49..6116e6e9dc 100644
--- a/hw/arm/imx8mp-evk.c
+++ b/hw/arm/imx8mp-evk.c
@@ -110,9 +110,9 @@ static void imx8mp_evk_init(MachineState *machine)
blk = blk_by_legacy_dinfo(di);
bus = qdev_get_child_bus(DEVICE(&s->soc.usdhc[i]), "sd-bus");
- carddev = qdev_new_orphan(TYPE_SD_CARD);
+ carddev = qdev_new(OBJECT(machine), "sd-card[*]", TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev, bus, &error_fatal);
+ qdev_realize(carddev, bus, &error_fatal);
}
if (!qtest_enabled()) {
diff --git a/hw/arm/mcimx6ul-evk.c b/hw/arm/mcimx6ul-evk.c
index 96309e1bfc..be4c4ca316 100644
--- a/hw/arm/mcimx6ul-evk.c
+++ b/hw/arm/mcimx6ul-evk.c
@@ -59,9 +59,9 @@ static void mcimx6ul_evk_init(MachineState *machine)
di = drive_get(IF_SD, 0, i);
blk = di ? blk_by_legacy_dinfo(di) : NULL;
bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
- carddev = qdev_new_orphan(TYPE_SD_CARD);
+ carddev = qdev_new(OBJECT(machine), "sd-card[*]", TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev, bus, &error_fatal);
+ qdev_realize(carddev, bus, &error_fatal);
}
if (!qtest_enabled()) {
diff --git a/hw/arm/mcimx7d-sabre.c b/hw/arm/mcimx7d-sabre.c
index be9d0d6993..d8b1e7fc7e 100644
--- a/hw/arm/mcimx7d-sabre.c
+++ b/hw/arm/mcimx7d-sabre.c
@@ -59,9 +59,9 @@ static void mcimx7d_sabre_init(MachineState *machine)
di = drive_get(IF_SD, 0, i);
blk = di ? blk_by_legacy_dinfo(di) : NULL;
bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
- carddev = qdev_new_orphan(TYPE_SD_CARD);
+ carddev = qdev_new(OBJECT(machine), "sd-card[*]", TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev, bus, &error_fatal);
+ qdev_realize(carddev, bus, &error_fatal);
}
if (!qtest_enabled()) {
diff --git a/hw/arm/sabrelite.c b/hw/arm/sabrelite.c
index af4dfef7f2..04c764f82f 100644
--- a/hw/arm/sabrelite.c
+++ b/hw/arm/sabrelite.c
@@ -96,13 +96,14 @@ static void sabrelite_init(MachineState *machine)
qemu_irq cs_line;
DriveInfo *dinfo = drive_get(IF_MTD, 0, 0);
- flash_dev = qdev_new_orphan("sst25vf016b");
+ flash_dev = qdev_new(OBJECT(machine), "spi-flash",
+ "sst25vf016b");
if (dinfo) {
qdev_prop_set_drive_err(flash_dev, "drive",
blk_by_legacy_dinfo(dinfo),
&error_fatal);
}
- qdev_realize_and_unref(flash_dev, BUS(spi_bus), &error_fatal);
+ qdev_realize(flash_dev, BUS(spi_bus), &error_fatal);
cs_line = qdev_get_gpio_in_named(flash_dev, SSI_GPIO_CS, 0);
qdev_connect_gpio_out(DEVICE(&s->soc.gpio[2]), 19, cs_line);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 070/134] hw/arm/misc: Give onboard devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (68 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 069/134] hw/arm/imx: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 071/134] hw/arm/aspeed: Give onboard devices a QOM parent (part 1) Alexander Graf
` (64 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the hw/arm misc
board files to the new parented API introduced earlier in this
series, so every onboard device gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing SoC device for
composite children. Names follow existing QOM conventions.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/max78000fthr.c:29 | qdev_new_orphan | OBJECT(machine) | "soc" | board init; existing add_child(machine,"soc") collapsed; drop _and_unref
hw/arm/msf2-som.c:62 | qdev_new_orphan | OBJECT(machine) | "soc" | board init; existing add_child(machine,"soc") collapsed; drop _and_unref
hw/arm/msf2-som.c:86 | qdev_new_orphan | OBJECT(machine) | "spi-flash" | board init; single m25p80 flash on SPI bus; drop _and_unref
hw/arm/netduino2.c:47 | qdev_new_orphan | OBJECT(machine) | "soc" | board init; existing add_child(machine,"soc") collapsed; drop _and_unref
hw/arm/netduinoplus2.c:47 | qdev_new_orphan | OBJECT(machine) | "soc" | board init; existing add_child(machine,"soc") collapsed; drop _and_unref
hw/arm/olimex-stm32-h405.c:50 | qdev_new_orphan | OBJECT(machine) | "soc" | board init; existing add_child(machine,"soc") collapsed; drop _and_unref
hw/arm/raspi.c:286 | qdev_new_orphan | OBJECT(machine) | "sd-card" | raspi_base_machine_init(MachineState *machine); single SD card; drop _and_unref
hw/arm/stm32vldiscovery.c:50 | qdev_new_orphan | OBJECT(machine) | "soc" | board init; existing add_child(machine,"soc") collapsed; drop _and_unref
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/max78000fthr.c | 5 ++---
hw/arm/msf2-som.c | 10 +++++-----
hw/arm/netduino2.c | 5 ++---
hw/arm/netduinoplus2.c | 5 ++---
hw/arm/olimex-stm32-h405.c | 5 ++---
hw/arm/raspi.c | 4 ++--
hw/arm/stm32vldiscovery.c | 5 ++---
7 files changed, 17 insertions(+), 22 deletions(-)
diff --git a/hw/arm/max78000fthr.c b/hw/arm/max78000fthr.c
index d2fb4c018b..e38a3340a4 100644
--- a/hw/arm/max78000fthr.c
+++ b/hw/arm/max78000fthr.c
@@ -26,10 +26,9 @@ static void max78000_init(MachineState *machine)
sysclk = clock_new(OBJECT(machine), "SYSCLK");
clock_set_hz(sysclk, SYSCLK_FRQ);
- dev = qdev_new_orphan(TYPE_MAX78000_SOC);
- object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
+ dev = qdev_new(OBJECT(machine), "soc", TYPE_MAX78000_SOC);
qdev_connect_clock_in(dev, "sysclk", sysclk);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
armv7m_load_kernel(ARM_CPU(first_cpu),
machine->kernel_filename,
diff --git a/hw/arm/msf2-som.c b/hw/arm/msf2-som.c
index bb1e774764..0d0e2514dd 100644
--- a/hw/arm/msf2-som.c
+++ b/hw/arm/msf2-som.c
@@ -59,8 +59,7 @@ static void emcraft_sf2_s2s010_init(MachineState *machine)
&error_fatal);
memory_region_add_subregion(sysmem, DDR_BASE_ADDRESS, ddr);
- dev = qdev_new_orphan(TYPE_MSF2_SOC);
- object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
+ dev = qdev_new(OBJECT(machine), "soc", TYPE_MSF2_SOC);
qdev_prop_set_string(dev, "part-name", "M2S010");
qdev_prop_set_uint64(dev, "eNVM-size", M2S010_ENVM_SIZE);
qdev_prop_set_uint64(dev, "eSRAM-size", M2S010_ESRAM_SIZE);
@@ -77,19 +76,20 @@ static void emcraft_sf2_s2s010_init(MachineState *machine)
qdev_prop_set_uint32(dev, "apb0div", 2);
qdev_prop_set_uint32(dev, "apb1div", 2);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
soc = MSF2_SOC(dev);
/* Attach SPI flash to SPI0 controller */
spi_bus = qdev_get_child_bus(dev, "spi0");
- spi_flash = qdev_new_orphan("s25sl12801"); /* Spansion S25FL128SDPBHICO */
+ /* Spansion S25FL128SDPBHICO */
+ spi_flash = qdev_new(OBJECT(machine), "spi-flash", "s25sl12801");
qdev_prop_set_uint8(spi_flash, "spansion-cr2nv", 0x8);
if (dinfo) {
qdev_prop_set_drive_err(spi_flash, "drive",
blk_by_legacy_dinfo(dinfo), &error_fatal);
}
- qdev_realize_and_unref(spi_flash, spi_bus, &error_fatal);
+ qdev_realize(spi_flash, spi_bus, &error_fatal);
cs_line = qdev_get_gpio_in_named(spi_flash, SSI_GPIO_CS, 0);
sysbus_connect_irq(SYS_BUS_DEVICE(&soc->spi[0]), 1, cs_line);
diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c
index cee887c194..9a1caf06a1 100644
--- a/hw/arm/netduino2.c
+++ b/hw/arm/netduino2.c
@@ -44,10 +44,9 @@ static void netduino2_init(MachineState *machine)
sysclk = clock_new(OBJECT(machine), "SYSCLK");
clock_set_hz(sysclk, SYSCLK_FRQ);
- dev = qdev_new_orphan(TYPE_STM32F205_SOC);
- object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
+ dev = qdev_new(OBJECT(machine), "soc", TYPE_STM32F205_SOC);
qdev_connect_clock_in(dev, "sysclk", sysclk);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
armv7m_load_kernel(STM32F205_SOC(dev)->armv7m.cpu, machine->kernel_filename,
0, FLASH_SIZE);
diff --git a/hw/arm/netduinoplus2.c b/hw/arm/netduinoplus2.c
index 65251dfe96..564dae1f16 100644
--- a/hw/arm/netduinoplus2.c
+++ b/hw/arm/netduinoplus2.c
@@ -44,10 +44,9 @@ static void netduinoplus2_init(MachineState *machine)
sysclk = clock_new(OBJECT(machine), "SYSCLK");
clock_set_hz(sysclk, SYSCLK_FRQ);
- dev = qdev_new_orphan(TYPE_STM32F405_SOC);
- object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
+ dev = qdev_new(OBJECT(machine), "soc", TYPE_STM32F405_SOC);
qdev_connect_clock_in(dev, "sysclk", sysclk);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
armv7m_load_kernel(STM32F405_SOC(dev)->armv7m.cpu,
machine->kernel_filename,
diff --git a/hw/arm/olimex-stm32-h405.c b/hw/arm/olimex-stm32-h405.c
index 70f7791695..b24142e909 100644
--- a/hw/arm/olimex-stm32-h405.c
+++ b/hw/arm/olimex-stm32-h405.c
@@ -47,10 +47,9 @@ static void olimex_stm32_h405_init(MachineState *machine)
sysclk = clock_new(OBJECT(machine), "SYSCLK");
clock_set_hz(sysclk, SYSCLK_FRQ);
- dev = qdev_new_orphan(TYPE_STM32F405_SOC);
- object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
+ dev = qdev_new(OBJECT(machine), "soc", TYPE_STM32F405_SOC);
qdev_connect_clock_in(dev, "sysclk", sysclk);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
armv7m_load_kernel(STM32F405_SOC(dev)->armv7m.cpu,
machine->kernel_filename,
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 2d5f51506d..55ca84cd1d 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -283,9 +283,9 @@ void raspi_base_machine_init(MachineState *machine,
error_report("No SD bus found in SOC object");
exit(1);
}
- carddev = qdev_new_orphan(TYPE_SD_CARD);
+ carddev = qdev_new(OBJECT(machine), "sd-card", TYPE_SD_CARD);
qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
- qdev_realize_and_unref(carddev, bus, &error_fatal);
+ qdev_realize(carddev, bus, &error_fatal);
vcram_size = object_property_get_uint(OBJECT(soc), "vcram-size",
&error_abort);
diff --git a/hw/arm/stm32vldiscovery.c b/hw/arm/stm32vldiscovery.c
index 8c37d41e63..69503805cb 100644
--- a/hw/arm/stm32vldiscovery.c
+++ b/hw/arm/stm32vldiscovery.c
@@ -47,10 +47,9 @@ static void stm32vldiscovery_init(MachineState *machine)
sysclk = clock_new(OBJECT(machine), "SYSCLK");
clock_set_hz(sysclk, SYSCLK_FRQ);
- dev = qdev_new_orphan(TYPE_STM32F100_SOC);
- object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
+ dev = qdev_new(OBJECT(machine), "soc", TYPE_STM32F100_SOC);
qdev_connect_clock_in(dev, "sysclk", sysclk);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
armv7m_load_kernel(STM32F100_SOC(dev)->armv7m.cpu,
machine->kernel_filename,
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 071/134] hw/arm/aspeed: Give onboard devices a QOM parent (part 1)
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (69 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 070/134] hw/arm/misc: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 072/134] hw/arm/aspeed: Give onboard devices a QOM parent (part 2) Alexander Graf
` (63 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the smaller
hw/arm/aspeed_* board files and the shared aspeed helpers to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.
The parent for each device is the object that owns its lifetime: the
machine (AspeedMachineState) for board-created I2C peripherals, the
containing SoC device for composite children. Names follow existing
QOM conventions.
The shared helpers aspeed_create_pca9552(), aspeed_create_pca9554()
and aspeed_soc_uart_realize() gain an Object *parent first argument;
callers in the four large aspeed board files are updated here so
this commit builds standalone, but the direct *_orphan() calls in
those four files are converted in the next commit.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/aspeed_* boards — per-callsite rationale (62 sites)
============================================================
Common context: all *_i2c_init(AspeedMachineState *bmc) callbacks are invoked
from aspeed_machine_init() (mc->init) via amc->i2c_init(bmc). bmc is the
MachineState → parent = OBJECT(bmc). i2c_slave_create_simple realizes
internally, so no realize-call change needed. i2c_slave_new pairs with
qdev_realize (i2c_slave_realize does not exist).
File:Line Old call Parent Name Notes
--------------------------------------- ------------------------------------ -------------- ------------ ------------------------------------------
aspeed_ast1040_evb.c:59 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp105" board i2c_init callback
aspeed_ast10x0_evb.c:77 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp105" board i2c_init callback
aspeed_ast2400_palmetto.c:40 i2c_slave_create_simple_orphan OBJECT(bmc) "rtc" ds1338 RTC
aspeed_ast2400_palmetto.c:46 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp423" single instance
aspeed_ast2400_quanta-q71l.c:36 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp105[*]" 3× tmp105 → auto-index
aspeed_ast2400_quanta-q71l.c:37 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp105[*]"
aspeed_ast2400_quanta-q71l.c:38 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp105[*]"
aspeed_ast2400_quanta-q71l.c:44 i2c_slave_create_simple_orphan OBJECT(bmc) "i2c-mux[*]" pca954x muxes
aspeed_ast2400_quanta-q71l.c:45 i2c_slave_create_simple_orphan OBJECT(bmc) "i2c-mux[*]"
aspeed_ast2400_quanta-q71l.c:50 i2c_slave_create_simple_orphan OBJECT(bmc) "i2c-mux[*]"
aspeed_ast2400_supermicrox11.c:40 i2c_slave_create_simple_orphan OBJECT(bmc) "rtc" ds1338
aspeed_ast2400_supermicrox11.c:46 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp423"
aspeed_ast2500_evb.c:37 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp105"
aspeed_ast2500_g220a.c:35 i2c_slave_create_simple_orphan OBJECT(bmc) "emc1413[*]" 3× emc1413
aspeed_ast2500_g220a.c:41 i2c_slave_create_simple_orphan OBJECT(bmc) "emc1413[*]"
aspeed_ast2500_g220a.c:47 i2c_slave_create_simple_orphan OBJECT(bmc) "emc1413[*]"
aspeed_ast2500_romulus.c:33 i2c_slave_create_simple_orphan OBJECT(bmc) "rtc" ds1338
aspeed_ast2500_supermicro-x11spi.c:36 i2c_slave_create_simple_orphan OBJECT(bmc) "rtc" ds1338
aspeed_ast2500_supermicro-x11spi.c:42 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp423"
aspeed_ast2500_tiogapass.c:58 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp421[*]" 3× tmp421
aspeed_ast2500_tiogapass.c:59 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp421[*]"
aspeed_ast2500_tiogapass.c:60 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp421[*]"
aspeed_ast2500_witherspoon.c:47 i2c_slave_new_orphan OBJECT(bmc) "pca9552[*]" → i2c_slave_new; realize_and_unref → qdev_realize(dev, BUS(bus), ...)
aspeed_ast2500_witherspoon.c:61 i2c_slave_create_simple_orphan OBJECT(bmc) "dps310"
aspeed_ast2500_witherspoon.c:62 i2c_slave_create_simple_orphan OBJECT(bmc) "max31785"
aspeed_ast2500_witherspoon.c:63 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp423[*]" 2× tmp423
aspeed_ast2500_witherspoon.c:64 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp423[*]"
aspeed_ast2500_witherspoon.c:67 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp105"
aspeed_ast2500_witherspoon.c:74 i2c_slave_create_simple_orphan OBJECT(bmc) "rtc" ds1338
aspeed_ast2500_witherspoon.c:78 i2c_slave_new_orphan OBJECT(bmc) "pca9552[*]" → i2c_slave_new; realize_and_unref → qdev_realize
aspeed_ast2500_yosemitev2.c:58 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp421[*]" 3× tmp421
aspeed_ast2500_yosemitev2.c:59 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp421[*]"
aspeed_ast2500_yosemitev2.c:60 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp421[*]"
aspeed_ast2600_bletchley.c:38 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp421[*]" loop 0..5
aspeed_ast2600_bletchley.c:40 i2c_slave_create_simple_orphan OBJECT(bmc) "pca9552[*]" loop 0..5
aspeed_ast2600_bletchley.c:41 i2c_slave_create_simple_orphan OBJECT(bmc) "pca9552[*]" loop 0..5
aspeed_ast2600_bletchley.c:48 i2c_slave_create_simple_orphan OBJECT(bmc) "rtc" ds1338
aspeed_ast2600_bletchley.c:55 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp421[*]"
aspeed_ast2600_bletchley.c:58 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp421[*]"
aspeed_ast2600_bletchley.c:60 i2c_slave_create_simple_orphan OBJECT(bmc) "pca9552[*]"
aspeed_ast2600_bletchley.c:64 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp421[*]"
aspeed_ast2600_bletchley.c:65 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp421[*]"
aspeed_ast2600_bletchley.c:66 i2c_slave_create_simple_orphan OBJECT(bmc) "pca9552[*]"
aspeed_ast2600_evb.c:30 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp105"
aspeed_ast2600_fby35.c:105 i2c_slave_create_simple_orphan OBJECT(bmc) "lm75[*]" 3× LM75 total
aspeed_ast2600_fby35.c:106 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp421"
aspeed_ast2600_fby35.c:108 i2c_slave_create_simple_orphan OBJECT(bmc) "adm1272"
aspeed_ast2600_fby35.c:109 i2c_slave_create_simple_orphan OBJECT(bmc) "lm75[*]"
aspeed_ast2600_fby35.c:110 i2c_slave_create_simple_orphan OBJECT(bmc) "lm75[*]"
aspeed_ast2600_gb200nvl.c:57 i2c_slave_create_simple_orphan OBJECT(bmc) "i2c-mux[*]" 6× pca9546
aspeed_ast2600_gb200nvl.c:58 i2c_slave_create_simple_orphan OBJECT(bmc) "i2c-mux[*]"
aspeed_ast2600_gb200nvl.c:59 i2c_slave_create_simple_orphan OBJECT(bmc) "i2c-mux[*]"
aspeed_ast2600_gb200nvl.c:60 i2c_slave_create_simple_orphan OBJECT(bmc) "i2c-mux[*]"
aspeed_ast2600_gb200nvl.c:61 i2c_slave_create_simple_orphan OBJECT(bmc) "i2c-mux[*]"
aspeed_ast2600_gb200nvl.c:62 i2c_slave_create_simple_orphan OBJECT(bmc) "i2c-mux[*]"
aspeed_ast27x0_evb.c:27 i2c_slave_create_simple_orphan OBJECT(bmc) "tmp105"
aspeed_ast27x0-fc.c:112 i2c_slave_create_simple_orphan OBJECT(machine) "tmp105" ast2700fc_ca35_init(MachineState *machine)
aspeed.c:93 qdev_new_orphan parent "sd-card[*]" static helper sdhci_attach_drive(): threaded
Object *parent as first arg; callers pass
OBJECT(bmc) from aspeed_machine_init.
qdev_realize_and_unref → qdev_realize.
aspeed.c:256 i2c_slave_create_simple_orphan parent "pca9552[*]" aspeed_create_pca9552(): threaded Object *parent
first arg. Prototype in include/hw/arm/aspeed.h
updated. Callers in rainier.c, gb200nvl.c updated
to pass OBJECT(bmc).
aspeed.c:262 i2c_slave_create_simple_orphan parent "pca9554[*]" aspeed_create_pca9554(): threaded Object *parent
first arg. Prototype updated. Callers in
gb200nvl.c updated to pass OBJECT(bmc).
aspeed_soc_common.c:84 qdev_new_orphan OBJECT(s) "ram-empty" aspeed_soc_dram_init(AspeedSoCState *s) called
from SoC realize (ast2400/2600). Parent = SoC.
sysbus_realize_and_unref → sysbus_realize.
aspeed_soc_common.c:131 qdev_new_orphan parent "flash[*]" aspeed_board_init_flashes(): threaded Object
*parent first arg. Called from board init
(aspeed.c, ast10x0_evb.c, ast27x0-fc.c) — all
callers pass OBJECT(bmc)/OBJECT(machine).
Prototype in include/hw/arm/aspeed_soc.h updated.
qdev_realize_and_unref → qdev_realize.
Threaded-parent helper changes (all callers updated in same diff):
sdhci_attach_drive() hw/arm/aspeed.c (static) — 2 callers in aspeed.c
aspeed_create_pca9552() hw/arm/aspeed.c + aspeed.h — 16 callers in aspeed_ast2600_rainier.c
aspeed_create_pca9554() hw/arm/aspeed.c + aspeed.h — 3 callers in aspeed_ast2600_gb200nvl.c
aspeed_board_init_flashes() hw/arm/aspeed_soc_common.c + aspeed_soc.h — 8 callers
(aspeed.c ×3, ast10x0_evb.c ×3, ast27x0-fc.c ×2)
Not touched (per instructions): at24c_eeprom_init*(), smbus_eeprom_init*().
orphan_justified = 0
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/aspeed.c | 37 +++++++++++++----------
hw/arm/aspeed_ast1040_evb.c | 3 +-
hw/arm/aspeed_ast10x0_evb.c | 9 +++---
hw/arm/aspeed_ast2400_palmetto.c | 6 ++--
hw/arm/aspeed_ast2400_quanta-q71l.c | 18 +++++++----
hw/arm/aspeed_ast2400_supermicrox11.c | 6 ++--
hw/arm/aspeed_ast2500_evb.c | 5 +--
hw/arm/aspeed_ast2500_g220a.c | 9 ++++--
hw/arm/aspeed_ast2500_romulus.c | 3 +-
hw/arm/aspeed_ast2500_supermicro-x11spi.c | 6 ++--
hw/arm/aspeed_ast2500_tiogapass.c | 9 ++++--
hw/arm/aspeed_ast2500_witherspoon.c | 32 +++++++++++---------
hw/arm/aspeed_ast2500_yosemitev2.c | 9 ++++--
hw/arm/aspeed_ast2600_bletchley.c | 29 ++++++++++++------
hw/arm/aspeed_ast2600_evb.c | 5 +--
hw/arm/aspeed_ast2600_fby35.c | 10 +++---
hw/arm/aspeed_ast2600_gb200nvl.c | 18 +++++------
hw/arm/aspeed_ast2600_rainier.c | 32 ++++++++++----------
hw/arm/aspeed_ast27x0-fc.c | 9 ++++--
hw/arm/aspeed_ast27x0_evb.c | 3 +-
hw/arm/aspeed_soc_common.c | 12 +++++---
include/hw/arm/aspeed.h | 10 +++---
include/hw/arm/aspeed_soc.h | 3 +-
23 files changed, 167 insertions(+), 116 deletions(-)
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 4a4c1f1556..2e76e09f8f 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -82,15 +82,16 @@ static void aspeed_reset_secondary(ARMCPU *cpu,
cpu_set_pc(cs, info->smp_loader_start);
}
-static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
- bool boot_emmc)
+static void sdhci_attach_drive(Object *parent, SDHCIState *sdhci,
+ DriveInfo *dinfo, bool emmc, bool boot_emmc)
{
DeviceState *card;
if (!dinfo) {
return;
}
- card = qdev_new_orphan(emmc ? TYPE_EMMC : TYPE_SD_CARD);
+ card = qdev_new(parent, "sd-card[*]",
+ emmc ? TYPE_EMMC : TYPE_SD_CARD);
/*
* Force the boot properties of the eMMC device only when the
@@ -108,9 +109,8 @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
}
qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
&error_fatal);
- qdev_realize_and_unref(card,
- qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
- &error_fatal);
+ qdev_realize(card, qdev_get_child_bus(DEVICE(sdhci), "sd-bus"),
+ &error_fatal);
}
void aspeed_connect_serial_hds_to_uarts(AspeedMachineState *bmc)
@@ -188,13 +188,13 @@ static void aspeed_machine_init(MachineState *machine)
qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
if (defaults_enabled()) {
- aspeed_board_init_flashes(&bmc->soc->fmc,
+ aspeed_board_init_flashes(OBJECT(bmc), &bmc->soc->fmc,
bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
amc->num_cs, 0);
- aspeed_board_init_flashes(&bmc->soc->spi[0],
+ aspeed_board_init_flashes(OBJECT(bmc), &bmc->soc->spi[0],
bmc->spi_model ? bmc->spi_model : amc->spi_model,
1, amc->num_cs);
- aspeed_board_init_flashes(&bmc->soc->spi[1],
+ aspeed_board_init_flashes(OBJECT(bmc), &bmc->soc->spi[1],
amc->spi2_model, 1, amc->num_cs2);
}
@@ -219,7 +219,7 @@ static void aspeed_machine_init(MachineState *machine)
}
for (i = 0; i < bmc->soc->sdhci.num_slots && defaults_enabled(); i++) {
- sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
+ sdhci_attach_drive(OBJECT(bmc), &bmc->soc->sdhci.slots[i],
drive_get(IF_SD, 0, i), false, false);
}
@@ -227,7 +227,8 @@ static void aspeed_machine_init(MachineState *machine)
if (bmc->soc->emmc.num_slots && defaults_enabled()) {
emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots);
- sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc);
+ sdhci_attach_drive(OBJECT(bmc), &bmc->soc->emmc.slots[0], emmc0,
+ true, boot_emmc);
}
if (!bmc->mmio_exec) {
@@ -251,16 +252,20 @@ static void aspeed_machine_init(MachineState *machine)
arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
}
-void aspeed_create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
+void aspeed_create_pca9552(Object *parent, AspeedSoCState *soc, int bus_id,
+ int addr)
{
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, bus_id),
+ i2c_slave_create_simple(parent, "pca9552[*]",
+ aspeed_i2c_get_bus(&soc->i2c, bus_id),
TYPE_PCA9552, addr);
}
-I2CSlave *aspeed_create_pca9554(AspeedSoCState *soc, int bus_id, int addr)
+I2CSlave *aspeed_create_pca9554(Object *parent, AspeedSoCState *soc,
+ int bus_id, int addr)
{
- return i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, bus_id),
- TYPE_PCA9554, addr);
+ return i2c_slave_create_simple(parent, "pca9554[*]",
+ aspeed_i2c_get_bus(&soc->i2c, bus_id),
+ TYPE_PCA9554, addr);
}
static bool aspeed_get_mmio_exec(Object *obj, Error **errp)
diff --git a/hw/arm/aspeed_ast1040_evb.c b/hw/arm/aspeed_ast1040_evb.c
index fb83087b13..bbb1ebb104 100644
--- a/hw/arm/aspeed_ast1040_evb.c
+++ b/hw/arm/aspeed_ast1040_evb.c
@@ -56,7 +56,8 @@ static void ast1040_evb_i2c_init(AspeedMachineState *bmc)
smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
eeprom_buf);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp105",
+ aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
}
static void aspeed_machine_ast1040_evb_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast10x0_evb.c b/hw/arm/aspeed_ast10x0_evb.c
index dc134b555c..5153cf7c55 100644
--- a/hw/arm/aspeed_ast10x0_evb.c
+++ b/hw/arm/aspeed_ast10x0_evb.c
@@ -40,16 +40,16 @@ static void aspeed_minibmc_machine_init(MachineState *machine)
qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
if (defaults_enabled()) {
- aspeed_board_init_flashes(&bmc->soc->fmc,
+ aspeed_board_init_flashes(OBJECT(bmc), &bmc->soc->fmc,
bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
amc->num_cs,
0);
- aspeed_board_init_flashes(&bmc->soc->spi[0],
+ aspeed_board_init_flashes(OBJECT(bmc), &bmc->soc->spi[0],
bmc->spi_model ? bmc->spi_model : amc->spi_model,
amc->num_cs, amc->num_cs);
- aspeed_board_init_flashes(&bmc->soc->spi[1],
+ aspeed_board_init_flashes(OBJECT(bmc), &bmc->soc->spi[1],
bmc->spi_model ? bmc->spi_model : amc->spi_model,
amc->num_cs, (amc->num_cs * 2));
}
@@ -74,7 +74,8 @@ static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
eeprom_buf);
/* U11 LM75 connects to SDA/SCL Group 2 by default */
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp105",
+ aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
}
static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast2400_palmetto.c b/hw/arm/aspeed_ast2400_palmetto.c
index 80f9c911b8..3ca52cc7a5 100644
--- a/hw/arm/aspeed_ast2400_palmetto.c
+++ b/hw/arm/aspeed_ast2400_palmetto.c
@@ -37,13 +37,15 @@ static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
* The palmetto platform expects a ds3231 RTC but a ds1338 is
* enough to provide basic RTC features. Alarms will be missing
*/
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
+ i2c_slave_create_simple(OBJECT(bmc), "rtc",
+ aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
eeprom_buf);
/* add a TMP423 temperature sensor */
- dev = DEVICE(i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 2),
+ dev = DEVICE(i2c_slave_create_simple(OBJECT(bmc), "tmp423",
+ aspeed_i2c_get_bus(&soc->i2c, 2),
"tmp423", 0x4c));
object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
diff --git a/hw/arm/aspeed_ast2400_quanta-q71l.c b/hw/arm/aspeed_ast2400_quanta-q71l.c
index 802ae49604..cc358b9ecf 100644
--- a/hw/arm/aspeed_ast2400_quanta-q71l.c
+++ b/hw/arm/aspeed_ast2400_quanta-q71l.c
@@ -33,21 +33,27 @@ static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
* The quanta-q71l platform expects tmp75s which are compatible with
* tmp105s.
*/
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4c);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4e);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4f);
/* TODO: i2c-1: Add baseboard FRU eeprom@54 24c64 */
/* TODO: i2c-1: Add Frontpanel FRU eeprom@57 24c64 */
/* TODO: Add Memory Riser i2c mux and eeproms. */
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
+ i2c_slave_create_simple(OBJECT(bmc), "i2c-mux[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 2), "pca9546", 0x74);
+ i2c_slave_create_simple(OBJECT(bmc), "i2c-mux[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 2), "pca9548", 0x77);
/* TODO: i2c-3: Add BIOS FRU eeprom@56 24c64 */
/* i2c-7 */
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
+ i2c_slave_create_simple(OBJECT(bmc), "i2c-mux[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 7), "pca9546", 0x70);
/* - i2c@0: pmbus@59 */
/* - i2c@1: pmbus@58 */
/* - i2c@2: pmbus@58 */
diff --git a/hw/arm/aspeed_ast2400_supermicrox11.c b/hw/arm/aspeed_ast2400_supermicrox11.c
index b18adf3981..cabeb951f9 100644
--- a/hw/arm/aspeed_ast2400_supermicrox11.c
+++ b/hw/arm/aspeed_ast2400_supermicrox11.c
@@ -37,13 +37,15 @@ static void supermicrox11_bmc_i2c_init(AspeedMachineState *bmc)
* The palmetto platform expects a ds3231 RTC but a ds1338 is
* enough to provide basic RTC features. Alarms will be missing
*/
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
+ i2c_slave_create_simple(OBJECT(bmc), "rtc",
+ aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
eeprom_buf);
/* add a TMP423 temperature sensor */
- dev = DEVICE(i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 2),
+ dev = DEVICE(i2c_slave_create_simple(OBJECT(bmc), "tmp423",
+ aspeed_i2c_get_bus(&soc->i2c, 2),
"tmp423", 0x4c));
object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
diff --git a/hw/arm/aspeed_ast2500_evb.c b/hw/arm/aspeed_ast2500_evb.c
index ba8a56bafd..933ffa087a 100644
--- a/hw/arm/aspeed_ast2500_evb.c
+++ b/hw/arm/aspeed_ast2500_evb.c
@@ -34,8 +34,9 @@ static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
eeprom_buf);
/* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 7),
- TYPE_TMP105, 0x4d);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp105",
+ aspeed_i2c_get_bus(&soc->i2c, 7),
+ TYPE_TMP105, 0x4d);
}
static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast2500_g220a.c b/hw/arm/aspeed_ast2500_g220a.c
index 27c9dc436a..c7c3e3efd3 100644
--- a/hw/arm/aspeed_ast2500_g220a.c
+++ b/hw/arm/aspeed_ast2500_g220a.c
@@ -32,19 +32,22 @@ static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
AspeedSoCState *soc = bmc->soc;
DeviceState *dev;
- dev = DEVICE(i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 3),
+ dev = DEVICE(i2c_slave_create_simple(OBJECT(bmc), "emc1413[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 3),
"emc1413", 0x4c));
object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
- dev = DEVICE(i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 12),
+ dev = DEVICE(i2c_slave_create_simple(OBJECT(bmc), "emc1413[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 12),
"emc1413", 0x4c));
object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
- dev = DEVICE(i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 13),
+ dev = DEVICE(i2c_slave_create_simple(OBJECT(bmc), "emc1413[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 13),
"emc1413", 0x4c));
object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
diff --git a/hw/arm/aspeed_ast2500_romulus.c b/hw/arm/aspeed_ast2500_romulus.c
index 1bbd2802f1..9abb69d6a1 100644
--- a/hw/arm/aspeed_ast2500_romulus.c
+++ b/hw/arm/aspeed_ast2500_romulus.c
@@ -30,7 +30,8 @@ static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
* good enough
*/
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
+ i2c_slave_create_simple(OBJECT(bmc), "rtc",
+ aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
}
static void aspeed_machine_romulus_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast2500_supermicro-x11spi.c b/hw/arm/aspeed_ast2500_supermicro-x11spi.c
index bea459eeaa..f20b2d5efb 100644
--- a/hw/arm/aspeed_ast2500_supermicro-x11spi.c
+++ b/hw/arm/aspeed_ast2500_supermicro-x11spi.c
@@ -33,13 +33,15 @@ static void supermicro_x11spi_bmc_i2c_init(AspeedMachineState *bmc)
* The palmetto platform expects a ds3231 RTC but a ds1338 is
* enough to provide basic RTC features. Alarms will be missing
*/
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
+ i2c_slave_create_simple(OBJECT(bmc), "rtc",
+ aspeed_i2c_get_bus(&soc->i2c, 0), "ds1338", 0x68);
smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 0), 0x50,
eeprom_buf);
/* add a TMP423 temperature sensor */
- dev = DEVICE(i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 2),
+ dev = DEVICE(i2c_slave_create_simple(OBJECT(bmc), "tmp423",
+ aspeed_i2c_get_bus(&soc->i2c, 2),
"tmp423", 0x4c));
object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
diff --git a/hw/arm/aspeed_ast2500_tiogapass.c b/hw/arm/aspeed_ast2500_tiogapass.c
index a6b3c0d051..13d1db9cfa 100644
--- a/hw/arm/aspeed_ast2500_tiogapass.c
+++ b/hw/arm/aspeed_ast2500_tiogapass.c
@@ -55,9 +55,12 @@ static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
/* TMP421 */
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 8), "tmp421", 0x1f);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4f);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 6), "tmp421", 0x4e);
}
static void aspeed_machine_tiogapass_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast2500_witherspoon.c b/hw/arm/aspeed_ast2500_witherspoon.c
index dda090ab60..2ba7ebb461 100644
--- a/hw/arm/aspeed_ast2500_witherspoon.c
+++ b/hw/arm/aspeed_ast2500_witherspoon.c
@@ -44,11 +44,9 @@ static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
LEDState *led;
/* Bus 3: TODO bmp280@77 */
- dev = DEVICE(i2c_slave_new_orphan(TYPE_PCA9552, 0x60));
+ dev = DEVICE(i2c_slave_new(OBJECT(bmc), "pca9552[*]", TYPE_PCA9552, 0x60));
qdev_prop_set_string(dev, "description", "pca1");
- i2c_slave_realize_and_unref(I2C_SLAVE(dev),
- aspeed_i2c_get_bus(&soc->i2c, 3),
- &error_fatal);
+ qdev_realize(dev, BUS(aspeed_i2c_get_bus(&soc->i2c, 3)), &error_fatal);
for (size_t i = 0; i < ARRAY_SIZE(pca1_leds); i++) {
led = led_create_simple(OBJECT(bmc),
@@ -58,28 +56,32 @@ static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
qdev_connect_gpio_out(dev, pca1_leds[i].gpio_id,
qdev_get_gpio_in(DEVICE(led), 0));
}
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
+ i2c_slave_create_simple(OBJECT(bmc), "dps310",
+ aspeed_i2c_get_bus(&soc->i2c, 3), "dps310", 0x76);
+ i2c_slave_create_simple(OBJECT(bmc), "max31785",
+ aspeed_i2c_get_bus(&soc->i2c, 3), "max31785", 0x52);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp423[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 4), "tmp423", 0x4c);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp423[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 5), "tmp423", 0x4c);
/* The Witherspoon expects a TMP275 but a TMP105 is compatible */
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
- 0x4a);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp105",
+ aspeed_i2c_get_bus(&soc->i2c, 9), TYPE_TMP105,
+ 0x4a);
/*
* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
* good enough
*/
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
+ i2c_slave_create_simple(OBJECT(bmc), "rtc",
+ aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
smbus_eeprom_init_one(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 11), 0x51,
eeprom_buf);
- dev = DEVICE(i2c_slave_new_orphan(TYPE_PCA9552, 0x60));
+ dev = DEVICE(i2c_slave_new(OBJECT(bmc), "pca9552[*]", TYPE_PCA9552, 0x60));
qdev_prop_set_string(dev, "description", "pca0");
- i2c_slave_realize_and_unref(I2C_SLAVE(dev),
- aspeed_i2c_get_bus(&soc->i2c, 11),
- &error_fatal);
+ qdev_realize(dev, BUS(aspeed_i2c_get_bus(&soc->i2c, 11)), &error_fatal);
/* Bus 11: TODO ucd90160@64 */
}
diff --git a/hw/arm/aspeed_ast2500_yosemitev2.c b/hw/arm/aspeed_ast2500_yosemitev2.c
index 905758c345..4e3c19bc07 100644
--- a/hw/arm/aspeed_ast2500_yosemitev2.c
+++ b/hw/arm/aspeed_ast2500_yosemitev2.c
@@ -55,9 +55,12 @@ static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
/* TMP421 */
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 11), "tmp421", 0x1f);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4e);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 9), "tmp421", 0x4f);
}
diff --git a/hw/arm/aspeed_ast2600_bletchley.c b/hw/arm/aspeed_ast2600_bletchley.c
index 4930bddb39..58f0bc89bd 100644
--- a/hw/arm/aspeed_ast2600_bletchley.c
+++ b/hw/arm/aspeed_ast2600_bletchley.c
@@ -35,35 +35,44 @@ static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
for (int i = 0; i < 6; i++) {
/* Missing model: ti,ina230 @ 0x45 */
/* Missing model: mps,mp5023 @ 0x40 */
- i2c_slave_create_simple_orphan(i2c[i], TYPE_TMP421, 0x4f);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
+ i2c[i], TYPE_TMP421, 0x4f);
/* Missing model: nxp,pca9539 @ 0x76, but PCA9552 works enough */
- i2c_slave_create_simple_orphan(i2c[i], TYPE_PCA9552, 0x76);
- i2c_slave_create_simple_orphan(i2c[i], TYPE_PCA9552, 0x67);
+ i2c_slave_create_simple(OBJECT(bmc), "pca9552[*]",
+ i2c[i], TYPE_PCA9552, 0x76);
+ i2c_slave_create_simple(OBJECT(bmc), "pca9552[*]",
+ i2c[i], TYPE_PCA9552, 0x67);
/* Missing model: fsc,fusb302 @ 0x22 */
}
/* Bus 6 */
at24c_eeprom_init(i2c[6], 0x56, 65536);
/* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
- i2c_slave_create_simple_orphan(i2c[6], "ds1338", 0x51);
+ i2c_slave_create_simple(OBJECT(bmc), "rtc", i2c[6], "ds1338", 0x51);
/* Bus 7 */
at24c_eeprom_init(i2c[7], 0x54, 65536);
/* Bus 9 */
- i2c_slave_create_simple_orphan(i2c[9], TYPE_TMP421, 0x4f);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
+ i2c[9], TYPE_TMP421, 0x4f);
/* Bus 10 */
- i2c_slave_create_simple_orphan(i2c[10], TYPE_TMP421, 0x4f);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
+ i2c[10], TYPE_TMP421, 0x4f);
/* Missing model: ti,hdc1080 @ 0x40 */
- i2c_slave_create_simple_orphan(i2c[10], TYPE_PCA9552, 0x67);
+ i2c_slave_create_simple(OBJECT(bmc), "pca9552[*]",
+ i2c[10], TYPE_PCA9552, 0x67);
/* Bus 12 */
/* Missing model: adi,adm1278 @ 0x11 */
- i2c_slave_create_simple_orphan(i2c[12], TYPE_TMP421, 0x4c);
- i2c_slave_create_simple_orphan(i2c[12], TYPE_TMP421, 0x4d);
- i2c_slave_create_simple_orphan(i2c[12], TYPE_PCA9552, 0x67);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
+ i2c[12], TYPE_TMP421, 0x4c);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
+ i2c[12], TYPE_TMP421, 0x4d);
+ i2c_slave_create_simple(OBJECT(bmc), "pca9552[*]",
+ i2c[12], TYPE_PCA9552, 0x67);
}
static void aspeed_machine_bletchley_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast2600_evb.c b/hw/arm/aspeed_ast2600_evb.c
index ab7667da75..8e389dbe80 100644
--- a/hw/arm/aspeed_ast2600_evb.c
+++ b/hw/arm/aspeed_ast2600_evb.c
@@ -27,8 +27,9 @@ static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
eeprom_buf);
/* LM75 is compatible with TMP105 driver */
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 8),
- TYPE_TMP105, 0x4d);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp105",
+ aspeed_i2c_get_bus(&soc->i2c, 8),
+ TYPE_TMP105, 0x4d);
}
static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast2600_fby35.c b/hw/arm/aspeed_ast2600_fby35.c
index fcd1acdc17..dedc273ee3 100644
--- a/hw/arm/aspeed_ast2600_fby35.c
+++ b/hw/arm/aspeed_ast2600_fby35.c
@@ -102,12 +102,12 @@ static void fby35_i2c_init(AspeedMachineState *bmc)
i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
}
- i2c_slave_create_simple_orphan(i2c[2], TYPE_LM75, 0x4f);
- i2c_slave_create_simple_orphan(i2c[8], TYPE_TMP421, 0x1f);
+ i2c_slave_create_simple(OBJECT(bmc), "lm75[*]", i2c[2], TYPE_LM75, 0x4f);
+ i2c_slave_create_simple(OBJECT(bmc), "tmp421", i2c[8], TYPE_TMP421, 0x1f);
/* Hotswap controller is actually supposed to be mp5920 or ltc4282. */
- i2c_slave_create_simple_orphan(i2c[11], "adm1272", 0x44);
- i2c_slave_create_simple_orphan(i2c[12], TYPE_LM75, 0x4e);
- i2c_slave_create_simple_orphan(i2c[12], TYPE_LM75, 0x4f);
+ i2c_slave_create_simple(OBJECT(bmc), "adm1272", i2c[11], "adm1272", 0x44);
+ i2c_slave_create_simple(OBJECT(bmc), "lm75[*]", i2c[12], TYPE_LM75, 0x4e);
+ i2c_slave_create_simple(OBJECT(bmc), "lm75[*]", i2c[12], TYPE_LM75, 0x4f);
at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
diff --git a/hw/arm/aspeed_ast2600_gb200nvl.c b/hw/arm/aspeed_ast2600_gb200nvl.c
index 2c1c513674..1cf35f96bd 100644
--- a/hw/arm/aspeed_ast2600_gb200nvl.c
+++ b/hw/arm/aspeed_ast2600_gb200nvl.c
@@ -51,23 +51,23 @@ static void gb200nvl_bmc_i2c_init(AspeedMachineState *bmc)
}
/* Bus 5 Expander */
- aspeed_create_pca9554(soc, 4, 0x21);
+ aspeed_create_pca9554(OBJECT(bmc), soc, 4, 0x21);
/* Mux I2c Expanders */
- i2c_slave_create_simple_orphan(i2c[5], "pca9546", 0x71);
- i2c_slave_create_simple_orphan(i2c[5], "pca9546", 0x72);
- i2c_slave_create_simple_orphan(i2c[5], "pca9546", 0x73);
- i2c_slave_create_simple_orphan(i2c[5], "pca9546", 0x75);
- i2c_slave_create_simple_orphan(i2c[5], "pca9546", 0x76);
- i2c_slave_create_simple_orphan(i2c[5], "pca9546", 0x77);
+ i2c_slave_create_simple(OBJECT(bmc), "i2c-mux[*]", i2c[5], "pca9546", 0x71);
+ i2c_slave_create_simple(OBJECT(bmc), "i2c-mux[*]", i2c[5], "pca9546", 0x72);
+ i2c_slave_create_simple(OBJECT(bmc), "i2c-mux[*]", i2c[5], "pca9546", 0x73);
+ i2c_slave_create_simple(OBJECT(bmc), "i2c-mux[*]", i2c[5], "pca9546", 0x75);
+ i2c_slave_create_simple(OBJECT(bmc), "i2c-mux[*]", i2c[5], "pca9546", 0x76);
+ i2c_slave_create_simple(OBJECT(bmc), "i2c-mux[*]", i2c[5], "pca9546", 0x77);
/* Bus 10 */
- dev = DEVICE(aspeed_create_pca9554(soc, 9, 0x20));
+ dev = DEVICE(aspeed_create_pca9554(OBJECT(bmc), soc, 9, 0x20));
/* Set FPGA_READY */
object_property_set_str(OBJECT(dev), "pin1", "high", &error_fatal);
- aspeed_create_pca9554(soc, 9, 0x21);
+ aspeed_create_pca9554(OBJECT(bmc), soc, 9, 0x21);
at24c_eeprom_init(i2c[9], 0x50, 64 * KiB);
at24c_eeprom_init(i2c[9], 0x51, 64 * KiB);
diff --git a/hw/arm/aspeed_ast2600_rainier.c b/hw/arm/aspeed_ast2600_rainier.c
index 0495c2880c..8ba15aceca 100644
--- a/hw/arm/aspeed_ast2600_rainier.c
+++ b/hw/arm/aspeed_ast2600_rainier.c
@@ -70,7 +70,7 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
- aspeed_create_pca9552(soc, 3, 0x61);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 3, 0x61);
/* The rainier expects a TMP275 but a TMP105 is compatible */
i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
@@ -84,14 +84,14 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
- aspeed_create_pca9552(soc, 4, 0x60);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 4, 0x60);
i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
0x48);
i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
0x49);
- aspeed_create_pca9552(soc, 5, 0x60);
- aspeed_create_pca9552(soc, 5, 0x61);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 5, 0x60);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 5, 0x61);
i2c_mux = i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 5),
"pca9546", 0x70);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
@@ -110,12 +110,12 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
- aspeed_create_pca9552(soc, 7, 0x30);
- aspeed_create_pca9552(soc, 7, 0x31);
- aspeed_create_pca9552(soc, 7, 0x32);
- aspeed_create_pca9552(soc, 7, 0x33);
- aspeed_create_pca9552(soc, 7, 0x60);
- aspeed_create_pca9552(soc, 7, 0x61);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 7, 0x30);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 7, 0x31);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 7, 0x32);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 7, 0x33);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 7, 0x60);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 7, 0x61);
i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
/* Bus 7: TODO si7021-a20@20 */
i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
@@ -132,8 +132,8 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
- aspeed_create_pca9552(soc, 8, 0x60);
- aspeed_create_pca9552(soc, 8, 0x61);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 8, 0x60);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 8, 0x61);
/* Bus 8: ucd90320@11 */
/* Bus 8: ucd90320@b */
/* Bus 8: ucd90320@c */
@@ -154,17 +154,17 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
"pca9546", 0x70);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
- aspeed_create_pca9552(soc, 11, 0x60);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 11, 0x60);
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
- aspeed_create_pca9552(soc, 13, 0x60);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 13, 0x60);
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
- aspeed_create_pca9552(soc, 14, 0x60);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 14, 0x60);
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
- aspeed_create_pca9552(soc, 15, 0x60);
+ aspeed_create_pca9552(OBJECT(bmc), soc, 15, 0x60);
}
static void aspeed_machine_rainier_class_init(ObjectClass *oc, const void *data)
diff --git a/hw/arm/aspeed_ast27x0-fc.c b/hw/arm/aspeed_ast27x0-fc.c
index f21c842315..74626973bc 100644
--- a/hw/arm/aspeed_ast27x0-fc.c
+++ b/hw/arm/aspeed_ast27x0-fc.c
@@ -109,10 +109,13 @@ static bool ast2700fc_ca35_init(MachineState *machine, Error **errp)
/*
* AST2700 EVB has a LM75 temperature sensor on I2C bus 0 at address 0x4d.
*/
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0), "tmp105", 0x4d);
+ i2c_slave_create_simple(OBJECT(machine), "tmp105",
+ aspeed_i2c_get_bus(&soc->i2c, 0), "tmp105", 0x4d);
- aspeed_board_init_flashes(&soc->fmc, AST2700FC_FMC_MODEL, 2, 0);
- aspeed_board_init_flashes(&soc->spi[0], AST2700FC_SPI_MODEL, 1, 2);
+ aspeed_board_init_flashes(OBJECT(machine), &soc->fmc,
+ AST2700FC_FMC_MODEL, 2, 0);
+ aspeed_board_init_flashes(OBJECT(machine), &soc->spi[0],
+ AST2700FC_SPI_MODEL, 1, 2);
ast2700fc_board_info.ram_size = machine->ram_size;
ast2700fc_board_info.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
diff --git a/hw/arm/aspeed_ast27x0_evb.c b/hw/arm/aspeed_ast27x0_evb.c
index a59714372d..1892a59cce 100644
--- a/hw/arm/aspeed_ast27x0_evb.c
+++ b/hw/arm/aspeed_ast27x0_evb.c
@@ -24,7 +24,8 @@ static void ast2700_evb_i2c_init(AspeedMachineState *bmc)
AspeedSoCState *soc = bmc->soc;
/* LM75 is compatible with TMP105 driver */
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 0),
+ i2c_slave_create_simple(OBJECT(bmc), "tmp105",
+ aspeed_i2c_get_bus(&soc->i2c, 0),
TYPE_TMP105, 0x4d);
}
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
index 33f7f10531..780a9659cc 100644
--- a/hw/arm/aspeed_soc_common.c
+++ b/hw/arm/aspeed_soc_common.c
@@ -81,11 +81,12 @@ bool aspeed_soc_dram_init(AspeedSoCState *s, Error **errp)
* SoC has.
*/
if (ram_size < max_ram_size) {
- DeviceState *dev = qdev_new_orphan(TYPE_UNIMPLEMENTED_DEVICE);
+ DeviceState *dev = qdev_new(OBJECT(s), "ram-empty",
+ TYPE_UNIMPLEMENTED_DEVICE);
qdev_prop_set_string(dev, "name", "ram-empty");
qdev_prop_set_uint64(dev, "size", max_ram_size - ram_size);
- if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp)) {
+ if (!sysbus_realize(SYS_BUS_DEVICE(dev), errp)) {
return false;
}
@@ -115,7 +116,8 @@ void aspeed_mmio_map_unimplemented(MemoryRegion *memory, SysBusDevice *dev,
sysbus_mmio_get_region(dev, 0), -1000);
}
-void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
+void aspeed_board_init_flashes(Object *parent, AspeedSMCState *s,
+ const char *flashtype,
unsigned int count, int unit0)
{
int i;
@@ -128,12 +130,12 @@ void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
DeviceState *dev;
- dev = qdev_new_orphan(flashtype);
+ dev = qdev_new(parent, "flash[*]", flashtype);
if (dinfo) {
qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
}
qdev_prop_set_uint8(dev, "cs", i);
- qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
+ qdev_realize(dev, BUS(s->spi), &error_fatal);
}
}
diff --git a/include/hw/arm/aspeed.h b/include/hw/arm/aspeed.h
index e1c0323cb6..743f7282ae 100644
--- a/include/hw/arm/aspeed.h
+++ b/include/hw/arm/aspeed.h
@@ -83,9 +83,10 @@ void aspeed_machine_class_init_cpus_defaults(MachineClass *mc);
*
* Create and attach a PCA9552 LED controller device to the specified I2C bus
* of the given Aspeed SoC. The device is instantiated using
- * i2c_slave_create_simple_orphan() with the PCA9552 device type.
+ * i2c_slave_create_simple() with the PCA9552 device type.
*/
-void aspeed_create_pca9552(AspeedSoCState *soc, int bus_id, int addr);
+void aspeed_create_pca9552(Object *parent, AspeedSoCState *soc, int bus_id,
+ int addr);
/*
* aspeed_create_pca9554:
@@ -95,11 +96,12 @@ void aspeed_create_pca9552(AspeedSoCState *soc, int bus_id, int addr);
*
* Create and attach a PCA9554 I/O expander to the specified I2C bus
* of the given Aspeed SoC. The device is created via
- * i2c_slave_create_simple_orphan() and returned as an #I2CSlave pointer.
+ * i2c_slave_create_simple() and returned as an #I2CSlave pointer.
*
* Returns: a pointer to the newly created #I2CSlave instance.
*/
-I2CSlave *aspeed_create_pca9554(AspeedSoCState *soc, int bus_id, int addr);
+I2CSlave *aspeed_create_pca9554(Object *parent, AspeedSoCState *soc,
+ int bus_id, int addr);
/*
* aspeed_machine_ast2600_class_emmc_init:
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
index 41dc04e293..d1ad82e00a 100644
--- a/include/hw/arm/aspeed_soc.h
+++ b/include/hw/arm/aspeed_soc.h
@@ -311,7 +311,8 @@ void aspeed_mmio_map(MemoryRegion *memory, SysBusDevice *dev, int n,
void aspeed_mmio_map_unimplemented(MemoryRegion *memory, SysBusDevice *dev,
const char *name, hwaddr addr,
uint64_t size);
-void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
+void aspeed_board_init_flashes(Object *parent, AspeedSMCState *s,
+ const char *flashtype,
unsigned int count, int unit0);
void aspeed_write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
Error **errp);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 072/134] hw/arm/aspeed: Give onboard devices a QOM parent (part 2)
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (70 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 071/134] hw/arm/aspeed: Give onboard devices a QOM parent (part 1) Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 073/134] hw/nvram/at24c: Give at24c_eeprom_init() a QOM parent Alexander Graf
` (62 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the *_orphan() device-creation calls in the four large
hw/arm/aspeed_ast2600_{anacapa,catalina,fuji,rainier}.c board
files to the new parented API introduced earlier in this series,
so every onboard I2C peripheral gets a stable path in the
composition tree instead of landing in /machine/unattached with an
unstable device[N] name.
The parent for each device is the machine (AspeedMachineState); the
board's .i2c_init() callback receives it directly. Names are
derived from the device type and auto-indexed.
Per-site rationale (reviewers: dispute the modeling here):
hw/arm/aspeed_ast2600_anacapa.c:240 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | anacapa_bmc_i2c_init(AspeedMachineState *bmc) is amc->i2c_init callback invoked from board init; bmc IS the MachineState. Multiple PCA954x muxes -> auto-index. Local Object *o = OBJECT(bmc) added.
hw/arm/aspeed_ast2600_anacapa.c:246 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_anacapa.c:250 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_anacapa.c:259 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_anacapa.c:264 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; PCA9552 GPIO expander behind mux, many instances -> auto-index.
hw/arm/aspeed_ast2600_anacapa.c:267 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_anacapa.c:275 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_anacapa.c:278 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_anacapa.c:294 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_anacapa.c:298 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_anacapa.c:306 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_anacapa.c:312 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_anacapa.c:320 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:475 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | catalina_bmc_i2c_init(AspeedMachineState *bmc) board i2c_init callback. Local Object *o = OBJECT(bmc) added. Many PCA954x -> auto-index.
hw/arm/aspeed_ast2600_catalina.c:478 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:482 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; PCA9535 GPIO expander -> auto-index.
hw/arm/aspeed_ast2600_catalina.c:489 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:492 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:495 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:499 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:506 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:511 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:528 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; multiple TMP75 -> auto-index.
hw/arm/aspeed_ast2600_catalina.c:532 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; PCA9554 GPIO expander -> auto-index with other GPIO expanders.
hw/arm/aspeed_ast2600_catalina.c:535 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:546 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:550 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:552 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:554 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:562 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:575 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:577 | i2c_slave_create_simple | OBJECT(bmc) | "rtc" | Board i2c_init; single DS1338 RTC.
hw/arm/aspeed_ast2600_catalina.c:581 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:583 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:591 | i2c_slave_create_simple | OBJECT(bmc) | "tmp421[*]" | Board i2c_init; two TMP421 -> auto-index.
hw/arm/aspeed_ast2600_catalina.c:618 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:620 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:622 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:624 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:626 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:628 | i2c_slave_create_simple | OBJECT(bmc) | "gpio[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_catalina.c:632 | i2c_slave_create_simple | OBJECT(bmc) | "tmp421[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:30 | i2c_slave_create_simple | parent | "i2c-mux[*]" | get_pca9548_channels() static helper called only from fuji_bmc_i2c_init(); no parent-capable pointer -> add Object *parent as first arg and thread OBJECT(bmc) from all 8 direct + 1 loop callers. 15 muxes total -> auto-index.
hw/arm/aspeed_ast2600_fuji.c:60 | i2c_slave_create_simple | OBJECT(bmc) | "lm75[*]" | fuji_bmc_i2c_init(AspeedMachineState *bmc) board i2c_init. Local Object *o = OBJECT(bmc) added. LM75/TMP75 both alias TYPE_TMP105 but keep source-macro-derived names for readability; auto-index.
hw/arm/aspeed_ast2600_fuji.c:61 | i2c_slave_create_simple | OBJECT(bmc) | "lm75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:71 | i2c_slave_create_simple | OBJECT(bmc) | "lm75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:72 | i2c_slave_create_simple | OBJECT(bmc) | "lm75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:73 | i2c_slave_create_simple | OBJECT(bmc) | "lm75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:74 | i2c_slave_create_simple | OBJECT(bmc) | "tmp422" | Board i2c_init; single TMP422.
hw/arm/aspeed_ast2600_fuji.c:77 | i2c_slave_create_simple | OBJECT(bmc) | "lm75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:79 | i2c_slave_create_simple | OBJECT(bmc) | "lm75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:81 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:82 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:84 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:85 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:88 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:89 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:96 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:97 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_fuji.c:106 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; loop x8 -> auto-index.
hw/arm/aspeed_ast2600_fuji.c:107 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; loop x8 -> auto-index.
hw/arm/aspeed_ast2600_fuji.c:108 | i2c_slave_create_simple | OBJECT(bmc) | "tmp75[*]" | Board i2c_init; loop x8 -> auto-index.
hw/arm/aspeed_ast2600_rainier.c:76 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | rainier_bmc_i2c_init(AspeedMachineState *bmc) board i2c_init. Local Object *o = OBJECT(bmc) added. Many TMP105 -> auto-index.
hw/arm/aspeed_ast2600_rainier.c:78 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:80 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:82 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; multiple PCA9546 -> auto-index.
hw/arm/aspeed_ast2600_rainier.c:89 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:91 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:95 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:100 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:102 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:104 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:106 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:119 | i2c_slave_create_simple | OBJECT(bmc) | "dps310" | Board i2c_init; single dps310 pressure sensor.
hw/arm/aspeed_ast2600_rainier.c:121 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:123 | i2c_slave_create_simple | OBJECT(bmc) | "max31785" | Board i2c_init; single max31785 fan controller.
hw/arm/aspeed_ast2600_rainier.c:127 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:129 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:141 | i2c_slave_create_simple | OBJECT(bmc) | "tmp423[*]" | Board i2c_init; four tmp423 -> auto-index.
hw/arm/aspeed_ast2600_rainier.c:142 | i2c_slave_create_simple | OBJECT(bmc) | "tmp423[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:145 | i2c_slave_create_simple | OBJECT(bmc) | "tmp423[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:146 | i2c_slave_create_simple | OBJECT(bmc) | "tmp423[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:149 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:151 | i2c_slave_create_simple | OBJECT(bmc) | "tmp105[*]" | Board i2c_init; auto-index.
hw/arm/aspeed_ast2600_rainier.c:153 | i2c_slave_create_simple | OBJECT(bmc) | "i2c-mux[*]" | Board i2c_init; auto-index.
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/aspeed_ast2600_anacapa.c | 31 ++++++----
hw/arm/aspeed_ast2600_catalina.c | 65 +++++++++++---------
hw/arm/aspeed_ast2600_fuji.c | 65 +++++++++++---------
hw/arm/aspeed_ast2600_rainier.c | 102 ++++++++++++++++++++-----------
4 files changed, 155 insertions(+), 108 deletions(-)
diff --git a/hw/arm/aspeed_ast2600_anacapa.c b/hw/arm/aspeed_ast2600_anacapa.c
index 98395f196b..d6412f5b0c 100644
--- a/hw/arm/aspeed_ast2600_anacapa.c
+++ b/hw/arm/aspeed_ast2600_anacapa.c
@@ -228,6 +228,7 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
AspeedSoCState *soc = bmc->soc;
I2CBus *i2c[16] = {};
I2CSlave *i2c_mux;
+ Object *o = OBJECT(bmc);
for (int i = 0; i < ARRAY_SIZE(i2c); i++) {
i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
@@ -237,17 +238,17 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* eeprom@50 */
at24c_eeprom_init(i2c[0], 0x50, 256 * KiB);
/* i2c-mux@70 */
- i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x70);
+ i2c_slave_create_simple(o, "i2c-mux[*]", i2c[0], TYPE_PCA9546, 0x70);
/* &i2c1 */
/* eeprom@50 */
at24c_eeprom_init(i2c[1], 0x50, 256 * KiB);
/* i2c-mux@70 (PCA9546) — 4 channels, empty */
- i2c_slave_create_simple_orphan(i2c[1], TYPE_PCA9546, 0x70);
+ i2c_slave_create_simple(o, "i2c-mux[*]", i2c[1], TYPE_PCA9546, 0x70);
/* &i2c4 */
/* i2c-mux@70 (PCA9548) */
- i2c_slave_create_simple_orphan(i2c[4], TYPE_PCA9548, 0x70);
+ i2c_slave_create_simple(o, "i2c-mux[*]", i2c[4], TYPE_PCA9548, 0x70);
/* &i2c6 */
/* eeprom@50 */
@@ -256,15 +257,16 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c8 */
/* i2c-mux@72 (PCA9546) */
- i2c_mux = i2c_slave_create_simple_orphan(i2c[8], TYPE_PCA9546, 0x72);
+ i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]", i2c[8],
+ TYPE_PCA9546, 0x72);
/* i2c8mux ch0 */
/* adc128d818@1f — no model */
/* pca9555@22 */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 0),
+ i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 0),
TYPE_PCA9552, 0x22);
/* pca9555@24 */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 0),
+ i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 0),
TYPE_PCA9552, 0x24);
/* eeprom@50 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 16 * KiB,
@@ -272,10 +274,10 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* i2c8mux ch1 */
/* pca9555@22 */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 1),
+ i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 1),
TYPE_PCA9552, 0x22);
/* pca9555@24 */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 1),
+ i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 1),
TYPE_PCA9552, 0x24);
/* eeprom@50 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 16 * KiB,
@@ -291,11 +293,12 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c10 */
/* i2c-mux@71 (PCA9548) */
- i2c_mux = i2c_slave_create_simple_orphan(i2c[10], TYPE_PCA9548, 0x71);
+ i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]", i2c[10],
+ TYPE_PCA9548, 0x71);
/* i2c10mux ch5 */
/* pca9555@22*/
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 5),
+ i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 5),
TYPE_PCA9552, 0x22);
/* eeprom@52 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 5), 0x52, 32 * KiB,
@@ -303,13 +306,14 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c11 */
/* i2c-mux@71 (PCA9548) */
- i2c_mux = i2c_slave_create_simple_orphan(i2c[11], TYPE_PCA9548, 0x71);
+ i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]", i2c[11],
+ TYPE_PCA9548, 0x71);
/* i2c11mux ch0-ch4 — empty */
/* i2c11mux ch5 */
/* pca9555@22 */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 5),
+ i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 5),
TYPE_PCA9552, 0x22);
/* eeprom@52 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 5), 0x52, 32 * KiB,
@@ -317,7 +321,8 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c13 */
/* i2c-mux@70 (PCA9548) */
- i2c_mux = i2c_slave_create_simple_orphan(i2c[13], TYPE_PCA9548, 0x70);
+ i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]", i2c[13],
+ TYPE_PCA9548, 0x70);
/* i2c13mux ch3 */
/* adc128d818@1f - no model */
diff --git a/hw/arm/aspeed_ast2600_catalina.c b/hw/arm/aspeed_ast2600_catalina.c
index c2c949ace3..59fc0d2437 100644
--- a/hw/arm/aspeed_ast2600_catalina.c
+++ b/hw/arm/aspeed_ast2600_catalina.c
@@ -464,6 +464,7 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
AspeedSoCState *soc = bmc->soc;
I2CBus *i2c[16] = {};
I2CSlave *i2c_mux;
+ Object *o = OBJECT(bmc);
/* busses 0-15 are all used. */
for (int i = 0; i < ARRAY_SIZE(i2c); i++) {
@@ -472,43 +473,46 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c0 */
/* i2c-mux@71 (PCA9546) on i2c0 */
- i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x71);
+ i2c_slave_create_simple(o, "i2c-mux[*]", i2c[0], TYPE_PCA9546, 0x71);
/* i2c-mux@72 (PCA9546) on i2c0 */
- i2c_mux = i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x72);
+ i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]", i2c[0],
+ TYPE_PCA9546, 0x72);
/* i2c0mux1ch1 */
/* io_expander7 - pca9535@20 */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 1),
+ i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 1),
TYPE_PCA9535, 0x20);
/* eeprom@50 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 8 * KiB,
gb200io_eeprom, gb200io_eeprom_len);
/* i2c-mux@73 (PCA9546) on i2c0 */
- i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x73);
+ i2c_slave_create_simple(o, "i2c-mux[*]", i2c[0], TYPE_PCA9546, 0x73);
/* i2c-mux@75 (PCA9546) on i2c0 */
- i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x75);
+ i2c_slave_create_simple(o, "i2c-mux[*]", i2c[0], TYPE_PCA9546, 0x75);
/* i2c-mux@76 (PCA9546) on i2c0 */
- i2c_mux = i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x76);
+ i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]", i2c[0],
+ TYPE_PCA9546, 0x76);
/* i2c0mux4ch1 */
/* io_expander8 - pca9535@21 */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 1),
+ i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 1),
TYPE_PCA9535, 0x21);
/* eeprom@50 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 8 * KiB,
gb200io_eeprom, gb200io_eeprom_len);
/* i2c-mux@77 (PCA9546) on i2c0 */
- i2c_slave_create_simple_orphan(i2c[0], TYPE_PCA9546, 0x77);
+ i2c_slave_create_simple(o, "i2c-mux[*]", i2c[0], TYPE_PCA9546, 0x77);
/* &i2c1 */
/* i2c-mux@70 (PCA9548) on i2c1 */
- i2c_mux = i2c_slave_create_simple_orphan(i2c[1], TYPE_PCA9548, 0x70);
+ i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]", i2c[1],
+ TYPE_PCA9548, 0x70);
/* i2c1mux0ch0 */
/* ina238@41 - no model */
/* ina238@42 - no model */
@@ -525,14 +529,15 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 5), 0x54, 8 * KiB,
pdb_eeprom, pdb_eeprom_len);
/* tpm75@4f */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 5), TYPE_TMP75, 0x4f);
+ i2c_slave_create_simple(o, "tmp75[*]", pca954x_i2c_get_bus(i2c_mux, 5),
+ TYPE_TMP75, 0x4f);
/* i2c1mux0ch6 */
/* io_expander5 - pca9554@27 */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 6),
+ i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 6),
TYPE_PCA9554, 0x27);
/* io_expander6 - pca9555@25 */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 6),
+ i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 6),
TYPE_PCA9552, 0x25);
/* eeprom@51 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 6), 0x51, 8 * KiB,
@@ -543,15 +548,16 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 7), 0x53, 8 * KiB,
fio_eeprom, fio_eeprom_len);
/* temperature-sensor@4b - tmp75 */
- i2c_slave_create_simple_orphan(pca954x_i2c_get_bus(i2c_mux, 7), TYPE_TMP75, 0x4b);
+ i2c_slave_create_simple(o, "tmp75[*]", pca954x_i2c_get_bus(i2c_mux, 7),
+ TYPE_TMP75, 0x4b);
/* &i2c2 */
/* io_expander0 - pca9555@20 */
- i2c_slave_create_simple_orphan(i2c[2], TYPE_PCA9552, 0x20);
+ i2c_slave_create_simple(o, "gpio[*]", i2c[2], TYPE_PCA9552, 0x20);
/* io_expander0 - pca9555@21 */
- i2c_slave_create_simple_orphan(i2c[2], TYPE_PCA9552, 0x21);
+ i2c_slave_create_simple(o, "gpio[*]", i2c[2], TYPE_PCA9552, 0x21);
/* io_expander0 - pca9555@27 */
- i2c_slave_create_simple_orphan(i2c[2], TYPE_PCA9552, 0x27);
+ i2c_slave_create_simple(o, "gpio[*]", i2c[2], TYPE_PCA9552, 0x27);
/* eeprom@50 */
at24c_eeprom_init(i2c[2], 0x50, 8 * KiB);
/* eeprom@51 */
@@ -559,7 +565,8 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c5 */
/* i2c-mux@70 (PCA9548) on i2c5 */
- i2c_mux = i2c_slave_create_simple_orphan(i2c[5], TYPE_PCA9548, 0x70);
+ i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]", i2c[5],
+ TYPE_PCA9548, 0x70);
/* i2c5mux0ch6 */
/* eeprom@52 */
at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 6), 0x52, 8 * KiB,
@@ -572,15 +579,15 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c6 */
/* io_expander3 - pca9555@21 */
- i2c_slave_create_simple_orphan(i2c[6], TYPE_PCA9552, 0x21);
+ i2c_slave_create_simple(o, "gpio[*]", i2c[6], TYPE_PCA9552, 0x21);
/* rtc@6f - nct3018y */
- i2c_slave_create_simple_orphan(i2c[6], TYPE_DS1338, 0x6f);
+ i2c_slave_create_simple(o, "rtc", i2c[6], TYPE_DS1338, 0x6f);
/* &i2c9 */
/* io_expander4 - pca9555@4f */
- i2c_slave_create_simple_orphan(i2c[9], TYPE_PCA9552, 0x4f);
+ i2c_slave_create_simple(o, "gpio[*]", i2c[9], TYPE_PCA9552, 0x4f);
/* temperature-sensor@4b - tpm75 */
- i2c_slave_create_simple_orphan(i2c[9], TYPE_TMP75, 0x4b);
+ i2c_slave_create_simple(o, "tmp75[*]", i2c[9], TYPE_TMP75, 0x4b);
/* eeprom@50 */
at24c_eeprom_init_rom(i2c[9], 0x50, 8 * KiB, scm_eeprom, scm_eeprom_len);
/* eeprom@56 */
@@ -588,7 +595,7 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c10 */
/* temperature-sensor@1f - tpm421 */
- i2c_slave_create_simple_orphan(i2c[10], TYPE_TMP421, 0x1f);
+ i2c_slave_create_simple(o, "tmp421[*]", i2c[10], TYPE_TMP421, 0x1f);
/* eeprom@50 */
at24c_eeprom_init_rom(i2c[10], 0x50, 8 * KiB, nic_eeprom, nic_eeprom_len);
@@ -615,21 +622,21 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c14 */
/* io_expander9 - pca9555@10 */
- i2c_slave_create_simple_orphan(i2c[14], TYPE_PCA9552, 0x10);
+ i2c_slave_create_simple(o, "gpio[*]", i2c[14], TYPE_PCA9552, 0x10);
/* io_expander10 - pca9555@11 */
- i2c_slave_create_simple_orphan(i2c[14], TYPE_PCA9552, 0x11);
+ i2c_slave_create_simple(o, "gpio[*]", i2c[14], TYPE_PCA9552, 0x11);
/* io_expander11 - pca9555@12 */
- i2c_slave_create_simple_orphan(i2c[14], TYPE_PCA9552, 0x12);
+ i2c_slave_create_simple(o, "gpio[*]", i2c[14], TYPE_PCA9552, 0x12);
/* io_expander12 - pca9555@13 */
- i2c_slave_create_simple_orphan(i2c[14], TYPE_PCA9552, 0x13);
+ i2c_slave_create_simple(o, "gpio[*]", i2c[14], TYPE_PCA9552, 0x13);
/* io_expander13 - pca9555@14 */
- i2c_slave_create_simple_orphan(i2c[14], TYPE_PCA9552, 0x14);
+ i2c_slave_create_simple(o, "gpio[*]", i2c[14], TYPE_PCA9552, 0x14);
/* io_expander14 - pca9555@15 */
- i2c_slave_create_simple_orphan(i2c[14], TYPE_PCA9552, 0x15);
+ i2c_slave_create_simple(o, "gpio[*]", i2c[14], TYPE_PCA9552, 0x15);
/* &i2c15 */
/* temperature-sensor@1f - tmp421 */
- i2c_slave_create_simple_orphan(i2c[15], TYPE_TMP421, 0x1f);
+ i2c_slave_create_simple(o, "tmp421[*]", i2c[15], TYPE_TMP421, 0x1f);
/* eeprom@52 */
at24c_eeprom_init_rom(i2c[15], 0x52, 8 * KiB, nic_eeprom, nic_eeprom_len);
}
diff --git a/hw/arm/aspeed_ast2600_fuji.c b/hw/arm/aspeed_ast2600_fuji.c
index 59b2da1ccf..1e681d0090 100644
--- a/hw/arm/aspeed_ast2600_fuji.c
+++ b/hw/arm/aspeed_ast2600_fuji.c
@@ -24,10 +24,11 @@
#define FUJI_BMC_HW_STRAP2 0x00000000
#define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
-static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
- I2CBus **channels)
+static void get_pca9548_channels(Object *parent, I2CBus *bus,
+ uint8_t mux_addr, I2CBus **channels)
{
- I2CSlave *mux = i2c_slave_create_simple_orphan(bus, "pca9548", mux_addr);
+ I2CSlave *mux = i2c_slave_create_simple(parent, "i2c-mux[*]", bus,
+ "pca9548", mux_addr);
for (int i = 0; i < 8; i++) {
channels[i] = pca954x_i2c_get_bus(mux, i);
}
@@ -37,6 +38,7 @@ static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
{
AspeedSoCState *soc = bmc->soc;
I2CBus *i2c[144] = {};
+ Object *o = OBJECT(bmc);
for (int i = 0; i < 16; i++) {
i2c[i] = aspeed_i2c_get_bus(&soc->i2c, i);
@@ -45,20 +47,20 @@ static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
I2CBus *i2c480 = i2c[8];
I2CBus *i2c600 = i2c[11];
- get_pca9548_channels(i2c180, 0x70, &i2c[16]);
- get_pca9548_channels(i2c480, 0x70, &i2c[24]);
+ get_pca9548_channels(o, i2c180, 0x70, &i2c[16]);
+ get_pca9548_channels(o, i2c480, 0x70, &i2c[24]);
/* NOTE: The device tree skips [32, 40) in the alias numbering */
- get_pca9548_channels(i2c600, 0x77, &i2c[40]);
- get_pca9548_channels(i2c[24], 0x71, &i2c[48]);
- get_pca9548_channels(i2c[25], 0x72, &i2c[56]);
- get_pca9548_channels(i2c[26], 0x76, &i2c[64]);
- get_pca9548_channels(i2c[27], 0x76, &i2c[72]);
+ get_pca9548_channels(o, i2c600, 0x77, &i2c[40]);
+ get_pca9548_channels(o, i2c[24], 0x71, &i2c[48]);
+ get_pca9548_channels(o, i2c[25], 0x72, &i2c[56]);
+ get_pca9548_channels(o, i2c[26], 0x76, &i2c[64]);
+ get_pca9548_channels(o, i2c[27], 0x76, &i2c[72]);
for (int i = 0; i < 8; i++) {
- get_pca9548_channels(i2c[40 + i], 0x76, &i2c[80 + i * 8]);
+ get_pca9548_channels(o, i2c[40 + i], 0x76, &i2c[80 + i * 8]);
}
- i2c_slave_create_simple_orphan(i2c[17], TYPE_LM75, 0x4c);
- i2c_slave_create_simple_orphan(i2c[17], TYPE_LM75, 0x4d);
+ i2c_slave_create_simple(o, "lm75[*]", i2c[17], TYPE_LM75, 0x4c);
+ i2c_slave_create_simple(o, "lm75[*]", i2c[17], TYPE_LM75, 0x4d);
/*
* EEPROM 24c64 size is 64Kbits or 8 Kbytes
@@ -68,33 +70,33 @@ static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
at24c_eeprom_init(i2c[20], 0x50, 256);
at24c_eeprom_init(i2c[22], 0x52, 256);
- i2c_slave_create_simple_orphan(i2c[3], TYPE_LM75, 0x48);
- i2c_slave_create_simple_orphan(i2c[3], TYPE_LM75, 0x49);
- i2c_slave_create_simple_orphan(i2c[3], TYPE_LM75, 0x4a);
- i2c_slave_create_simple_orphan(i2c[3], TYPE_TMP422, 0x4c);
+ i2c_slave_create_simple(o, "lm75[*]", i2c[3], TYPE_LM75, 0x48);
+ i2c_slave_create_simple(o, "lm75[*]", i2c[3], TYPE_LM75, 0x49);
+ i2c_slave_create_simple(o, "lm75[*]", i2c[3], TYPE_LM75, 0x4a);
+ i2c_slave_create_simple(o, "tmp422", i2c[3], TYPE_TMP422, 0x4c);
at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
- i2c_slave_create_simple_orphan(i2c[8], TYPE_LM75, 0x4a);
+ i2c_slave_create_simple(o, "lm75[*]", i2c[8], TYPE_LM75, 0x4a);
- i2c_slave_create_simple_orphan(i2c[50], TYPE_LM75, 0x4c);
+ i2c_slave_create_simple(o, "lm75[*]", i2c[50], TYPE_LM75, 0x4c);
at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
- i2c_slave_create_simple_orphan(i2c[51], TYPE_TMP75, 0x48);
- i2c_slave_create_simple_orphan(i2c[52], TYPE_TMP75, 0x49);
+ i2c_slave_create_simple(o, "tmp75[*]", i2c[51], TYPE_TMP75, 0x48);
+ i2c_slave_create_simple(o, "tmp75[*]", i2c[52], TYPE_TMP75, 0x49);
- i2c_slave_create_simple_orphan(i2c[59], TYPE_TMP75, 0x48);
- i2c_slave_create_simple_orphan(i2c[60], TYPE_TMP75, 0x49);
+ i2c_slave_create_simple(o, "tmp75[*]", i2c[59], TYPE_TMP75, 0x48);
+ i2c_slave_create_simple(o, "tmp75[*]", i2c[60], TYPE_TMP75, 0x49);
at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
- i2c_slave_create_simple_orphan(i2c[66], TYPE_TMP75, 0x49);
- i2c_slave_create_simple_orphan(i2c[66], TYPE_TMP75, 0x48);
+ i2c_slave_create_simple(o, "tmp75[*]", i2c[66], TYPE_TMP75, 0x49);
+ i2c_slave_create_simple(o, "tmp75[*]", i2c[66], TYPE_TMP75, 0x48);
at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
- i2c_slave_create_simple_orphan(i2c[74], TYPE_TMP75, 0x49);
- i2c_slave_create_simple_orphan(i2c[74], TYPE_TMP75, 0x48);
+ i2c_slave_create_simple(o, "tmp75[*]", i2c[74], TYPE_TMP75, 0x49);
+ i2c_slave_create_simple(o, "tmp75[*]", i2c[74], TYPE_TMP75, 0x48);
at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
@@ -103,9 +105,12 @@ static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
for (int i = 0; i < 8; i++) {
at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
- i2c_slave_create_simple_orphan(i2c[82 + i * 8], TYPE_TMP75, 0x48);
- i2c_slave_create_simple_orphan(i2c[83 + i * 8], TYPE_TMP75, 0x4b);
- i2c_slave_create_simple_orphan(i2c[84 + i * 8], TYPE_TMP75, 0x4a);
+ i2c_slave_create_simple(o, "tmp75[*]", i2c[82 + i * 8],
+ TYPE_TMP75, 0x48);
+ i2c_slave_create_simple(o, "tmp75[*]", i2c[83 + i * 8],
+ TYPE_TMP75, 0x4b);
+ i2c_slave_create_simple(o, "tmp75[*]", i2c[84 + i * 8],
+ TYPE_TMP75, 0x4a);
}
}
diff --git a/hw/arm/aspeed_ast2600_rainier.c b/hw/arm/aspeed_ast2600_rainier.c
index 8ba15aceca..2f5e3daf3b 100644
--- a/hw/arm/aspeed_ast2600_rainier.c
+++ b/hw/arm/aspeed_ast2600_rainier.c
@@ -67,43 +67,55 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
{
AspeedSoCState *soc = bmc->soc;
I2CSlave *i2c_mux;
+ Object *o = OBJECT(bmc);
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
aspeed_create_pca9552(OBJECT(bmc), soc, 3, 0x61);
/* The rainier expects a TMP275 but a TMP105 is compatible */
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
- 0x48);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
- 0x49);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 4), TYPE_TMP105,
- 0x4a);
- i2c_mux = i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 4),
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 4),
+ TYPE_TMP105, 0x48);
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 4),
+ TYPE_TMP105, 0x49);
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 4),
+ TYPE_TMP105, 0x4a);
+ i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 4),
"pca9546", 0x70);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
aspeed_create_pca9552(OBJECT(bmc), soc, 4, 0x60);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
- 0x48);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 5), TYPE_TMP105,
- 0x49);
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 5),
+ TYPE_TMP105, 0x48);
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 5),
+ TYPE_TMP105, 0x49);
aspeed_create_pca9552(OBJECT(bmc), soc, 5, 0x60);
aspeed_create_pca9552(OBJECT(bmc), soc, 5, 0x61);
- i2c_mux = i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 5),
+ i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 5),
"pca9546", 0x70);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
- 0x48);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
- 0x4a);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 6), TYPE_TMP105,
- 0x4b);
- i2c_mux = i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 6),
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 6),
+ TYPE_TMP105, 0x48);
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 6),
+ TYPE_TMP105, 0x4a);
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 6),
+ TYPE_TMP105, 0x4b);
+ i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 6),
"pca9546", 0x70);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
@@ -116,18 +128,25 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
aspeed_create_pca9552(OBJECT(bmc), soc, 7, 0x33);
aspeed_create_pca9552(OBJECT(bmc), soc, 7, 0x60);
aspeed_create_pca9552(OBJECT(bmc), soc, 7, 0x61);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 7), "dps310", 0x76);
+ i2c_slave_create_simple(o, "dps310",
+ aspeed_i2c_get_bus(&soc->i2c, 7),
+ "dps310", 0x76);
/* Bus 7: TODO si7021-a20@20 */
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 7), TYPE_TMP105,
- 0x48);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 7), "max31785", 0x52);
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 7),
+ TYPE_TMP105, 0x48);
+ i2c_slave_create_simple(o, "max31785",
+ aspeed_i2c_get_bus(&soc->i2c, 7),
+ "max31785", 0x52);
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
- 0x48);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 8), TYPE_TMP105,
- 0x4a);
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 8),
+ TYPE_TMP105, 0x48);
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 8),
+ TYPE_TMP105, 0x4a);
at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
@@ -138,19 +157,30 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
/* Bus 8: ucd90320@b */
/* Bus 8: ucd90320@c */
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4c);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 9), "tmp423", 0x4d);
+ i2c_slave_create_simple(o, "tmp423[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 9),
+ "tmp423", 0x4c);
+ i2c_slave_create_simple(o, "tmp423[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 9),
+ "tmp423", 0x4d);
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4c);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 10), "tmp423", 0x4d);
+ i2c_slave_create_simple(o, "tmp423[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 10),
+ "tmp423", 0x4c);
+ i2c_slave_create_simple(o, "tmp423[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 10),
+ "tmp423", 0x4d);
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
- 0x48);
- i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11), TYPE_TMP105,
- 0x49);
- i2c_mux = i2c_slave_create_simple_orphan(aspeed_i2c_get_bus(&soc->i2c, 11),
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 11),
+ TYPE_TMP105, 0x48);
+ i2c_slave_create_simple(o, "tmp105[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 11),
+ TYPE_TMP105, 0x49);
+ i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]",
+ aspeed_i2c_get_bus(&soc->i2c, 11),
"pca9546", 0x70);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 073/134] hw/nvram/at24c: Give at24c_eeprom_init() a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (71 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 072/134] hw/arm/aspeed: Give onboard devices a QOM parent (part 2) Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 074/134] hw/i386/pc: Give pcspk " Alexander Graf
` (61 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Now that all callers of at24c_eeprom_init() and
at24c_eeprom_init_rom() live in already-converted hw/arm aspeed and
npcm board files, thread an Object *parent through these two
convenience helpers so that every I2C EEPROM created by an aspeed
or npcm board becomes a proper child of its machine instead of
landing under /machine/unattached.
Link: https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/aspeed_ast2500_tiogapass.c | 4 +--
hw/arm/aspeed_ast2500_yosemitev2.c | 4 +--
hw/arm/aspeed_ast2600_anacapa.c | 20 +++++++-------
hw/arm/aspeed_ast2600_bletchley.c | 4 +--
hw/arm/aspeed_ast2600_catalina.c | 34 ++++++++++++------------
hw/arm/aspeed_ast2600_fby35.c | 10 +++----
hw/arm/aspeed_ast2600_fuji.c | 34 ++++++++++++------------
hw/arm/aspeed_ast2600_gb200nvl.c | 6 ++---
hw/arm/aspeed_ast2600_rainier.c | 42 +++++++++++++++---------------
hw/arm/npcm7xx_boards.c | 8 +++---
hw/nvram/eeprom_at24c.c | 12 +++++----
include/hw/nvram/eeprom_at24c.h | 6 +++--
12 files changed, 94 insertions(+), 90 deletions(-)
diff --git a/hw/arm/aspeed_ast2500_tiogapass.c b/hw/arm/aspeed_ast2500_tiogapass.c
index 13d1db9cfa..c813fc7301 100644
--- a/hw/arm/aspeed_ast2500_tiogapass.c
+++ b/hw/arm/aspeed_ast2500_tiogapass.c
@@ -51,8 +51,8 @@ static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
{
AspeedSoCState *soc = bmc->soc;
- at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
- at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
+ at24c_eeprom_init(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
+ at24c_eeprom_init_rom(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
tiogapass_bmc_fruid, tiogapass_bmc_fruid_len);
/* TMP421 */
i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
diff --git a/hw/arm/aspeed_ast2500_yosemitev2.c b/hw/arm/aspeed_ast2500_yosemitev2.c
index 4e3c19bc07..57c9976051 100644
--- a/hw/arm/aspeed_ast2500_yosemitev2.c
+++ b/hw/arm/aspeed_ast2500_yosemitev2.c
@@ -51,8 +51,8 @@ static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
{
AspeedSoCState *soc = bmc->soc;
- at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
- at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
+ at24c_eeprom_init(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
+ at24c_eeprom_init_rom(OBJECT(bmc), aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
yosemitev2_bmc_fruid, yosemitev2_bmc_fruid_len);
/* TMP421 */
i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
diff --git a/hw/arm/aspeed_ast2600_anacapa.c b/hw/arm/aspeed_ast2600_anacapa.c
index d6412f5b0c..faf3fc070d 100644
--- a/hw/arm/aspeed_ast2600_anacapa.c
+++ b/hw/arm/aspeed_ast2600_anacapa.c
@@ -236,13 +236,13 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c0 */
/* eeprom@50 */
- at24c_eeprom_init(i2c[0], 0x50, 256 * KiB);
+ at24c_eeprom_init(o, i2c[0], 0x50, 256 * KiB);
/* i2c-mux@70 */
i2c_slave_create_simple(o, "i2c-mux[*]", i2c[0], TYPE_PCA9546, 0x70);
/* &i2c1 */
/* eeprom@50 */
- at24c_eeprom_init(i2c[1], 0x50, 256 * KiB);
+ at24c_eeprom_init(o, i2c[1], 0x50, 256 * KiB);
/* i2c-mux@70 (PCA9546) — 4 channels, empty */
i2c_slave_create_simple(o, "i2c-mux[*]", i2c[1], TYPE_PCA9546, 0x70);
@@ -252,7 +252,7 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* &i2c6 */
/* eeprom@50 */
- at24c_eeprom_init_rom(i2c[6], 0x50, 32 * KiB,
+ at24c_eeprom_init_rom(o, i2c[6], 0x50, 32 * KiB,
hpm_eeprom, hpm_eeprom_len);
/* &i2c8 */
@@ -269,7 +269,7 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 0),
TYPE_PCA9552, 0x24);
/* eeprom@50 */
- at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 16 * KiB,
+ at24c_eeprom_init_rom(o, pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 16 * KiB,
rpdb_eeprom, rpdb_eeprom_len);
/* i2c8mux ch1 */
@@ -280,15 +280,15 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 1),
TYPE_PCA9552, 0x24);
/* eeprom@50 */
- at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 16 * KiB,
+ at24c_eeprom_init_rom(o, pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 16 * KiB,
lpdb_eeprom, lpdb_eeprom_len);
/* &i2c9 */
/* eeprom@50 */
- at24c_eeprom_init_rom(i2c[9], 0x50, 16 * KiB,
+ at24c_eeprom_init_rom(o, i2c[9], 0x50, 16 * KiB,
scm_eeprom, scm_eeprom_len);
/* eeprom@56 */
- at24c_eeprom_init_rom(i2c[9], 0x56, 8 * KiB,
+ at24c_eeprom_init_rom(o, i2c[9], 0x56, 8 * KiB,
bsm_eeprom, bsm_eeprom_len);
/* &i2c10 */
@@ -301,7 +301,7 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 5),
TYPE_PCA9552, 0x22);
/* eeprom@52 */
- at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 5), 0x52, 32 * KiB,
+ at24c_eeprom_init_rom(o, pca954x_i2c_get_bus(i2c_mux, 5), 0x52, 32 * KiB,
rbb_eeprom, rbb_eeprom_len);
/* &i2c11 */
@@ -316,7 +316,7 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 5),
TYPE_PCA9552, 0x22);
/* eeprom@52 */
- at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 5), 0x52, 32 * KiB,
+ at24c_eeprom_init_rom(o, pca954x_i2c_get_bus(i2c_mux, 5), 0x52, 32 * KiB,
lbb_eeprom, lbb_eeprom_len);
/* &i2c13 */
@@ -329,7 +329,7 @@ static void anacapa_bmc_i2c_init(AspeedMachineState *bmc)
/* i2c13mux ch4 */
/* eeprom@51 */
- at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 4), 0x51, 32 * KiB,
+ at24c_eeprom_init_rom(o, pca954x_i2c_get_bus(i2c_mux, 4), 0x51, 32 * KiB,
hpm_brd_id_eeprom, hpm_brd_id_eeprom_len);
/* i2c13mux ch7 */
diff --git a/hw/arm/aspeed_ast2600_bletchley.c b/hw/arm/aspeed_ast2600_bletchley.c
index 58f0bc89bd..a9ae61f864 100644
--- a/hw/arm/aspeed_ast2600_bletchley.c
+++ b/hw/arm/aspeed_ast2600_bletchley.c
@@ -46,13 +46,13 @@ static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
}
/* Bus 6 */
- at24c_eeprom_init(i2c[6], 0x56, 65536);
+ at24c_eeprom_init(OBJECT(bmc), i2c[6], 0x56, 65536);
/* Missing model: nxp,pcf85263 @ 0x51 , but ds1338 works enough */
i2c_slave_create_simple(OBJECT(bmc), "rtc", i2c[6], "ds1338", 0x51);
/* Bus 7 */
- at24c_eeprom_init(i2c[7], 0x54, 65536);
+ at24c_eeprom_init(OBJECT(bmc), i2c[7], 0x54, 65536);
/* Bus 9 */
i2c_slave_create_simple(OBJECT(bmc), "tmp421[*]",
diff --git a/hw/arm/aspeed_ast2600_catalina.c b/hw/arm/aspeed_ast2600_catalina.c
index 59fc0d2437..e33e40590d 100644
--- a/hw/arm/aspeed_ast2600_catalina.c
+++ b/hw/arm/aspeed_ast2600_catalina.c
@@ -484,7 +484,7 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 1),
TYPE_PCA9535, 0x20);
/* eeprom@50 */
- at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 8 * KiB,
+ at24c_eeprom_init_rom(o, pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 8 * KiB,
gb200io_eeprom, gb200io_eeprom_len);
/* i2c-mux@73 (PCA9546) on i2c0 */
@@ -502,7 +502,7 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 1),
TYPE_PCA9535, 0x21);
/* eeprom@50 */
- at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 8 * KiB,
+ at24c_eeprom_init_rom(o, pca954x_i2c_get_bus(i2c_mux, 1), 0x50, 8 * KiB,
gb200io_eeprom, gb200io_eeprom_len);
/* i2c-mux@77 (PCA9546) on i2c0 */
@@ -526,7 +526,7 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* i2c1mux0ch5 */
/* eeprom@54 */
- at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 5), 0x54, 8 * KiB,
+ at24c_eeprom_init_rom(o, pca954x_i2c_get_bus(i2c_mux, 5), 0x54, 8 * KiB,
pdb_eeprom, pdb_eeprom_len);
/* tpm75@4f */
i2c_slave_create_simple(o, "tmp75[*]", pca954x_i2c_get_bus(i2c_mux, 5),
@@ -540,12 +540,12 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(o, "gpio[*]", pca954x_i2c_get_bus(i2c_mux, 6),
TYPE_PCA9552, 0x25);
/* eeprom@51 */
- at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 6), 0x51, 8 * KiB,
+ at24c_eeprom_init_rom(o, pca954x_i2c_get_bus(i2c_mux, 6), 0x51, 8 * KiB,
osfp_eeprom, osfp_eeprom_len);
/* i2c1mux0ch7 */
/* eeprom@53 */
- at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 7), 0x53, 8 * KiB,
+ at24c_eeprom_init_rom(o, pca954x_i2c_get_bus(i2c_mux, 7), 0x53, 8 * KiB,
fio_eeprom, fio_eeprom_len);
/* temperature-sensor@4b - tmp75 */
i2c_slave_create_simple(o, "tmp75[*]", pca954x_i2c_get_bus(i2c_mux, 7),
@@ -559,9 +559,9 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* io_expander0 - pca9555@27 */
i2c_slave_create_simple(o, "gpio[*]", i2c[2], TYPE_PCA9552, 0x27);
/* eeprom@50 */
- at24c_eeprom_init(i2c[2], 0x50, 8 * KiB);
+ at24c_eeprom_init(o, i2c[2], 0x50, 8 * KiB);
/* eeprom@51 */
- at24c_eeprom_init(i2c[2], 0x51, 8 * KiB);
+ at24c_eeprom_init(o, i2c[2], 0x51, 8 * KiB);
/* &i2c5 */
/* i2c-mux@70 (PCA9548) on i2c5 */
@@ -569,7 +569,7 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
TYPE_PCA9548, 0x70);
/* i2c5mux0ch6 */
/* eeprom@52 */
- at24c_eeprom_init_rom(pca954x_i2c_get_bus(i2c_mux, 6), 0x52, 8 * KiB,
+ at24c_eeprom_init_rom(o, pca954x_i2c_get_bus(i2c_mux, 6), 0x52, 8 * KiB,
hdd_eeprom, hdd_eeprom_len);
/* i2c5mux0ch7 */
/* ina230@40 - no model */
@@ -589,36 +589,36 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* temperature-sensor@4b - tpm75 */
i2c_slave_create_simple(o, "tmp75[*]", i2c[9], TYPE_TMP75, 0x4b);
/* eeprom@50 */
- at24c_eeprom_init_rom(i2c[9], 0x50, 8 * KiB, scm_eeprom, scm_eeprom_len);
+ at24c_eeprom_init_rom(o, i2c[9], 0x50, 8 * KiB, scm_eeprom, scm_eeprom_len);
/* eeprom@56 */
- at24c_eeprom_init_rom(i2c[9], 0x56, 8 * KiB, bsm_eeprom, bsm_eeprom_len);
+ at24c_eeprom_init_rom(o, i2c[9], 0x56, 8 * KiB, bsm_eeprom, bsm_eeprom_len);
/* &i2c10 */
/* temperature-sensor@1f - tpm421 */
i2c_slave_create_simple(o, "tmp421[*]", i2c[10], TYPE_TMP421, 0x1f);
/* eeprom@50 */
- at24c_eeprom_init_rom(i2c[10], 0x50, 8 * KiB, nic_eeprom, nic_eeprom_len);
+ at24c_eeprom_init_rom(o, i2c[10], 0x50, 8 * KiB, nic_eeprom, nic_eeprom_len);
/* &i2c11 */
/* ssif-bmc@10 - no model */
/* &i2c12 */
/* eeprom@50 */
- at24c_eeprom_init_rom(i2c[12], 0x50, 8 * KiB,
+ at24c_eeprom_init_rom(o, i2c[12], 0x50, 8 * KiB,
gb200_eeprom, gb200_eeprom_len);
/* eeprom@54 */
- at24c_eeprom_init_rom(i2c[12], 0x54, 256,
+ at24c_eeprom_init_rom(o, i2c[12], 0x54, 256,
cable_eeprom, cable_eeprom_len);
/* &i2c13 */
/* eeprom@50 */
- at24c_eeprom_init_rom(i2c[13], 0x50, 8 * KiB,
+ at24c_eeprom_init_rom(o, i2c[13], 0x50, 8 * KiB,
gb200_eeprom, gb200_eeprom_len);
/* eeprom@54 */
- at24c_eeprom_init_rom(i2c[13], 0x54, 256,
+ at24c_eeprom_init_rom(o, i2c[13], 0x54, 256,
cable_eeprom, cable_eeprom_len);
/* eeprom@57 */
- at24c_eeprom_init_rom(i2c[13], 0x57, 256, hmc_eeprom, hmc_eeprom_len);
+ at24c_eeprom_init_rom(o, i2c[13], 0x57, 256, hmc_eeprom, hmc_eeprom_len);
/* &i2c14 */
/* io_expander9 - pca9555@10 */
@@ -638,7 +638,7 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc)
/* temperature-sensor@1f - tmp421 */
i2c_slave_create_simple(o, "tmp421[*]", i2c[15], TYPE_TMP421, 0x1f);
/* eeprom@52 */
- at24c_eeprom_init_rom(i2c[15], 0x52, 8 * KiB, nic_eeprom, nic_eeprom_len);
+ at24c_eeprom_init_rom(o, i2c[15], 0x52, 8 * KiB, nic_eeprom, nic_eeprom_len);
}
static void aspeed_machine_catalina_class_init(ObjectClass *oc,
diff --git a/hw/arm/aspeed_ast2600_fby35.c b/hw/arm/aspeed_ast2600_fby35.c
index dedc273ee3..d7bea13706 100644
--- a/hw/arm/aspeed_ast2600_fby35.c
+++ b/hw/arm/aspeed_ast2600_fby35.c
@@ -109,13 +109,13 @@ static void fby35_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(OBJECT(bmc), "lm75[*]", i2c[12], TYPE_LM75, 0x4e);
i2c_slave_create_simple(OBJECT(bmc), "lm75[*]", i2c[12], TYPE_LM75, 0x4f);
- at24c_eeprom_init(i2c[4], 0x51, 128 * KiB);
- at24c_eeprom_init(i2c[6], 0x51, 128 * KiB);
- at24c_eeprom_init_rom(i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
+ at24c_eeprom_init(OBJECT(bmc), i2c[4], 0x51, 128 * KiB);
+ at24c_eeprom_init(OBJECT(bmc), i2c[6], 0x51, 128 * KiB);
+ at24c_eeprom_init_rom(OBJECT(bmc), i2c[8], 0x50, 32 * KiB, fby35_nic_fruid,
fby35_nic_fruid_len);
- at24c_eeprom_init_rom(i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
+ at24c_eeprom_init_rom(OBJECT(bmc), i2c[11], 0x51, 128 * KiB, fby35_bb_fruid,
fby35_bb_fruid_len);
- at24c_eeprom_init_rom(i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
+ at24c_eeprom_init_rom(OBJECT(bmc), i2c[11], 0x54, 128 * KiB, fby35_bmc_fruid,
fby35_bmc_fruid_len);
/*
diff --git a/hw/arm/aspeed_ast2600_fuji.c b/hw/arm/aspeed_ast2600_fuji.c
index 1e681d0090..396bd6c8b7 100644
--- a/hw/arm/aspeed_ast2600_fuji.c
+++ b/hw/arm/aspeed_ast2600_fuji.c
@@ -66,45 +66,45 @@ static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
* EEPROM 24c64 size is 64Kbits or 8 Kbytes
* 24c02 size is 2Kbits or 256 bytes
*/
- at24c_eeprom_init(i2c[19], 0x52, 8 * KiB);
- at24c_eeprom_init(i2c[20], 0x50, 256);
- at24c_eeprom_init(i2c[22], 0x52, 256);
+ at24c_eeprom_init(o, i2c[19], 0x52, 8 * KiB);
+ at24c_eeprom_init(o, i2c[20], 0x50, 256);
+ at24c_eeprom_init(o, i2c[22], 0x52, 256);
i2c_slave_create_simple(o, "lm75[*]", i2c[3], TYPE_LM75, 0x48);
i2c_slave_create_simple(o, "lm75[*]", i2c[3], TYPE_LM75, 0x49);
i2c_slave_create_simple(o, "lm75[*]", i2c[3], TYPE_LM75, 0x4a);
i2c_slave_create_simple(o, "tmp422", i2c[3], TYPE_TMP422, 0x4c);
- at24c_eeprom_init(i2c[8], 0x51, 8 * KiB);
+ at24c_eeprom_init(o, i2c[8], 0x51, 8 * KiB);
i2c_slave_create_simple(o, "lm75[*]", i2c[8], TYPE_LM75, 0x4a);
i2c_slave_create_simple(o, "lm75[*]", i2c[50], TYPE_LM75, 0x4c);
- at24c_eeprom_init(i2c[50], 0x52, 8 * KiB);
+ at24c_eeprom_init(o, i2c[50], 0x52, 8 * KiB);
i2c_slave_create_simple(o, "tmp75[*]", i2c[51], TYPE_TMP75, 0x48);
i2c_slave_create_simple(o, "tmp75[*]", i2c[52], TYPE_TMP75, 0x49);
i2c_slave_create_simple(o, "tmp75[*]", i2c[59], TYPE_TMP75, 0x48);
i2c_slave_create_simple(o, "tmp75[*]", i2c[60], TYPE_TMP75, 0x49);
- at24c_eeprom_init(i2c[65], 0x53, 8 * KiB);
+ at24c_eeprom_init(o, i2c[65], 0x53, 8 * KiB);
i2c_slave_create_simple(o, "tmp75[*]", i2c[66], TYPE_TMP75, 0x49);
i2c_slave_create_simple(o, "tmp75[*]", i2c[66], TYPE_TMP75, 0x48);
- at24c_eeprom_init(i2c[68], 0x52, 8 * KiB);
- at24c_eeprom_init(i2c[69], 0x52, 8 * KiB);
- at24c_eeprom_init(i2c[70], 0x52, 8 * KiB);
- at24c_eeprom_init(i2c[71], 0x52, 8 * KiB);
+ at24c_eeprom_init(o, i2c[68], 0x52, 8 * KiB);
+ at24c_eeprom_init(o, i2c[69], 0x52, 8 * KiB);
+ at24c_eeprom_init(o, i2c[70], 0x52, 8 * KiB);
+ at24c_eeprom_init(o, i2c[71], 0x52, 8 * KiB);
- at24c_eeprom_init(i2c[73], 0x53, 8 * KiB);
+ at24c_eeprom_init(o, i2c[73], 0x53, 8 * KiB);
i2c_slave_create_simple(o, "tmp75[*]", i2c[74], TYPE_TMP75, 0x49);
i2c_slave_create_simple(o, "tmp75[*]", i2c[74], TYPE_TMP75, 0x48);
- at24c_eeprom_init(i2c[76], 0x52, 8 * KiB);
- at24c_eeprom_init(i2c[77], 0x52, 8 * KiB);
- at24c_eeprom_init(i2c[78], 0x52, 8 * KiB);
- at24c_eeprom_init(i2c[79], 0x52, 8 * KiB);
- at24c_eeprom_init(i2c[28], 0x50, 256);
+ at24c_eeprom_init(o, i2c[76], 0x52, 8 * KiB);
+ at24c_eeprom_init(o, i2c[77], 0x52, 8 * KiB);
+ at24c_eeprom_init(o, i2c[78], 0x52, 8 * KiB);
+ at24c_eeprom_init(o, i2c[79], 0x52, 8 * KiB);
+ at24c_eeprom_init(o, i2c[28], 0x50, 256);
for (int i = 0; i < 8; i++) {
- at24c_eeprom_init(i2c[81 + i * 8], 0x56, 64 * KiB);
+ at24c_eeprom_init(o, i2c[81 + i * 8], 0x56, 64 * KiB);
i2c_slave_create_simple(o, "tmp75[*]", i2c[82 + i * 8],
TYPE_TMP75, 0x48);
i2c_slave_create_simple(o, "tmp75[*]", i2c[83 + i * 8],
diff --git a/hw/arm/aspeed_ast2600_gb200nvl.c b/hw/arm/aspeed_ast2600_gb200nvl.c
index 1cf35f96bd..357f30cf83 100644
--- a/hw/arm/aspeed_ast2600_gb200nvl.c
+++ b/hw/arm/aspeed_ast2600_gb200nvl.c
@@ -68,11 +68,11 @@ static void gb200nvl_bmc_i2c_init(AspeedMachineState *bmc)
object_property_set_str(OBJECT(dev), "pin1", "high", &error_fatal);
aspeed_create_pca9554(OBJECT(bmc), soc, 9, 0x21);
- at24c_eeprom_init(i2c[9], 0x50, 64 * KiB);
- at24c_eeprom_init(i2c[9], 0x51, 64 * KiB);
+ at24c_eeprom_init(OBJECT(bmc), i2c[9], 0x50, 64 * KiB);
+ at24c_eeprom_init(OBJECT(bmc), i2c[9], 0x51, 64 * KiB);
/* Bus 11 */
- at24c_eeprom_init_rom(i2c[10], 0x50, 256, gb200nvl_bmc_fruid,
+ at24c_eeprom_init_rom(OBJECT(bmc), i2c[10], 0x50, 256, gb200nvl_bmc_fruid,
gb200nvl_bmc_fruid_len);
}
diff --git a/hw/arm/aspeed_ast2600_rainier.c b/hw/arm/aspeed_ast2600_rainier.c
index 2f5e3daf3b..4ec36e6129 100644
--- a/hw/arm/aspeed_ast2600_rainier.c
+++ b/hw/arm/aspeed_ast2600_rainier.c
@@ -69,7 +69,7 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
I2CSlave *i2c_mux;
Object *o = OBJECT(bmc);
- at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
+ at24c_eeprom_init(o, aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
aspeed_create_pca9552(OBJECT(bmc), soc, 3, 0x61);
@@ -86,9 +86,9 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]",
aspeed_i2c_get_bus(&soc->i2c, 4),
"pca9546", 0x70);
- at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
- at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
- at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
+ at24c_eeprom_init(o, pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
+ at24c_eeprom_init(o, pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
+ at24c_eeprom_init(o, pca954x_i2c_get_bus(i2c_mux, 2), 0x52, 64 * KiB);
aspeed_create_pca9552(OBJECT(bmc), soc, 4, 0x60);
i2c_slave_create_simple(o, "tmp105[*]",
@@ -102,8 +102,8 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]",
aspeed_i2c_get_bus(&soc->i2c, 5),
"pca9546", 0x70);
- at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
- at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
+ at24c_eeprom_init(o, pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
+ at24c_eeprom_init(o, pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
i2c_slave_create_simple(o, "tmp105[*]",
aspeed_i2c_get_bus(&soc->i2c, 6),
@@ -117,10 +117,10 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]",
aspeed_i2c_get_bus(&soc->i2c, 6),
"pca9546", 0x70);
- at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
- at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
- at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
- at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
+ at24c_eeprom_init(o, pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
+ at24c_eeprom_init(o, pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
+ at24c_eeprom_init(o, pca954x_i2c_get_bus(i2c_mux, 2), 0x50, 64 * KiB);
+ at24c_eeprom_init(o, pca954x_i2c_get_bus(i2c_mux, 3), 0x51, 64 * KiB);
aspeed_create_pca9552(OBJECT(bmc), soc, 7, 0x30);
aspeed_create_pca9552(OBJECT(bmc), soc, 7, 0x31);
@@ -138,8 +138,8 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(o, "max31785",
aspeed_i2c_get_bus(&soc->i2c, 7),
"max31785", 0x52);
- at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
- at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
+ at24c_eeprom_init(o, aspeed_i2c_get_bus(&soc->i2c, 7), 0x50, 64 * KiB);
+ at24c_eeprom_init(o, aspeed_i2c_get_bus(&soc->i2c, 7), 0x51, 64 * KiB);
i2c_slave_create_simple(o, "tmp105[*]",
aspeed_i2c_get_bus(&soc->i2c, 8),
@@ -147,9 +147,9 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(o, "tmp105[*]",
aspeed_i2c_get_bus(&soc->i2c, 8),
TYPE_TMP105, 0x4a);
- at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
+ at24c_eeprom_init_rom(o, aspeed_i2c_get_bus(&soc->i2c, 8), 0x50,
64 * KiB, rainier_bb_fruid, rainier_bb_fruid_len);
- at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
+ at24c_eeprom_init_rom(o, aspeed_i2c_get_bus(&soc->i2c, 8), 0x51,
64 * KiB, rainier_bmc_fruid, rainier_bmc_fruid_len);
aspeed_create_pca9552(OBJECT(bmc), soc, 8, 0x60);
aspeed_create_pca9552(OBJECT(bmc), soc, 8, 0x61);
@@ -163,7 +163,7 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(o, "tmp423[*]",
aspeed_i2c_get_bus(&soc->i2c, 9),
"tmp423", 0x4d);
- at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
+ at24c_eeprom_init(o, aspeed_i2c_get_bus(&soc->i2c, 9), 0x50, 128 * KiB);
i2c_slave_create_simple(o, "tmp423[*]",
aspeed_i2c_get_bus(&soc->i2c, 10),
@@ -171,7 +171,7 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
i2c_slave_create_simple(o, "tmp423[*]",
aspeed_i2c_get_bus(&soc->i2c, 10),
"tmp423", 0x4d);
- at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
+ at24c_eeprom_init(o, aspeed_i2c_get_bus(&soc->i2c, 10), 0x50, 128 * KiB);
i2c_slave_create_simple(o, "tmp105[*]",
aspeed_i2c_get_bus(&soc->i2c, 11),
@@ -182,18 +182,18 @@ static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
i2c_mux = i2c_slave_create_simple(o, "i2c-mux[*]",
aspeed_i2c_get_bus(&soc->i2c, 11),
"pca9546", 0x70);
- at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
- at24c_eeprom_init(pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
+ at24c_eeprom_init(o, pca954x_i2c_get_bus(i2c_mux, 0), 0x50, 64 * KiB);
+ at24c_eeprom_init(o, pca954x_i2c_get_bus(i2c_mux, 1), 0x51, 64 * KiB);
aspeed_create_pca9552(OBJECT(bmc), soc, 11, 0x60);
- at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
+ at24c_eeprom_init(o, aspeed_i2c_get_bus(&soc->i2c, 13), 0x50, 64 * KiB);
aspeed_create_pca9552(OBJECT(bmc), soc, 13, 0x60);
- at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
+ at24c_eeprom_init(o, aspeed_i2c_get_bus(&soc->i2c, 14), 0x50, 64 * KiB);
aspeed_create_pca9552(OBJECT(bmc), soc, 14, 0x60);
- at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
+ at24c_eeprom_init(o, aspeed_i2c_get_bus(&soc->i2c, 15), 0x50, 64 * KiB);
aspeed_create_pca9552(OBJECT(bmc), soc, 15, 0x60);
}
diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
index 778ef0f232..1862d0d007 100644
--- a/hw/arm/npcm7xx_boards.c
+++ b/hw/arm/npcm7xx_boards.c
@@ -248,8 +248,8 @@ static void quanta_gsj_i2c_init(Object *parent, NPCM7xxState *soc)
i2c_slave_create_simple(parent, "tmp105[*]",
npcm7xx_i2c_get_bus(soc, 4), "tmp105", 0x5c);
- at24c_eeprom_init(npcm7xx_i2c_get_bus(soc, 9), 0x55, 8192);
- at24c_eeprom_init(npcm7xx_i2c_get_bus(soc, 10), 0x55, 8192);
+ at24c_eeprom_init(parent, npcm7xx_i2c_get_bus(soc, 9), 0x55, 8192);
+ at24c_eeprom_init(parent, npcm7xx_i2c_get_bus(soc, 10), 0x55, 8192);
/*
* i2c-11:
@@ -363,7 +363,7 @@ static void kudo_bmc_i2c_init(Object *parent, NPCM7xxState *soc)
i2c_slave_create_simple(parent, "pca9548[*]",
npcm7xx_i2c_get_bus(soc, 4), TYPE_PCA9548, 0x77);
- at24c_eeprom_init(npcm7xx_i2c_get_bus(soc, 4), 0x50, 8192); /* mbfru */
+ at24c_eeprom_init(parent, npcm7xx_i2c_get_bus(soc, 4), 0x50, 8192); /* mbfru */
i2c_mux = i2c_slave_create_simple(parent, "pca9548[*]",
npcm7xx_i2c_get_bus(soc, 13),
@@ -379,7 +379,7 @@ static void kudo_bmc_i2c_init(Object *parent, NPCM7xxState *soc)
i2c_slave_create_simple(parent, "tmp105[*]",
pca954x_i2c_get_bus(i2c_mux, 5), "tmp105", 0x49);
- at24c_eeprom_init(npcm7xx_i2c_get_bus(soc, 14), 0x55, 8192); /* bmcfru */
+ at24c_eeprom_init(parent, npcm7xx_i2c_get_bus(soc, 14), 0x55, 8192); /* bmcfru */
/* TODO: Add remaining i2c devices. */
}
diff --git a/hw/nvram/eeprom_at24c.c b/hw/nvram/eeprom_at24c.c
index b6d314447c..036955feee 100644
--- a/hw/nvram/eeprom_at24c.c
+++ b/hw/nvram/eeprom_at24c.c
@@ -138,17 +138,19 @@ int at24c_eeprom_send(I2CSlave *s, uint8_t data)
return 0;
}
-I2CSlave *at24c_eeprom_init(I2CBus *bus, uint8_t address, uint32_t rom_size)
+I2CSlave *at24c_eeprom_init(Object *parent, I2CBus *bus, uint8_t address,
+ uint32_t rom_size)
{
- return at24c_eeprom_init_rom(bus, address, rom_size, NULL, 0);
+ return at24c_eeprom_init_rom(parent, bus, address, rom_size, NULL, 0);
}
-I2CSlave *at24c_eeprom_init_rom(I2CBus *bus, uint8_t address, uint32_t rom_size,
+I2CSlave *at24c_eeprom_init_rom(Object *parent, I2CBus *bus, uint8_t address,
+ uint32_t rom_size,
const uint8_t *init_rom, uint32_t init_rom_size)
{
EEPROMState *s;
- s = AT24C_EE(i2c_slave_new_orphan(TYPE_AT24C_EE, address));
+ s = AT24C_EE(i2c_slave_new(parent, "eeprom[*]", TYPE_AT24C_EE, address));
qdev_prop_set_uint32(DEVICE(s), "rom-size", rom_size);
@@ -156,7 +158,7 @@ I2CSlave *at24c_eeprom_init_rom(I2CBus *bus, uint8_t address, uint32_t rom_size,
s->init_rom = init_rom;
s->init_rom_size = init_rom_size;
- i2c_slave_realize_and_unref(I2C_SLAVE(s), bus, &error_abort);
+ qdev_realize(DEVICE(s), BUS(bus), &error_abort);
return I2C_SLAVE(s);
}
diff --git a/include/hw/nvram/eeprom_at24c.h b/include/hw/nvram/eeprom_at24c.h
index acb9857b2a..6686c7ff46 100644
--- a/include/hw/nvram/eeprom_at24c.h
+++ b/include/hw/nvram/eeprom_at24c.h
@@ -18,7 +18,8 @@
* Create the device state structure, initialize it, put it on the specified
* @bus, and drop the reference to it (the device is realized).
*/
-I2CSlave *at24c_eeprom_init(I2CBus *bus, uint8_t address, uint32_t rom_size);
+I2CSlave *at24c_eeprom_init(Object *parent, I2CBus *bus, uint8_t address,
+ uint32_t rom_size);
/*
@@ -33,7 +34,8 @@ I2CSlave *at24c_eeprom_init(I2CBus *bus, uint8_t address, uint32_t rom_size);
* @bus, and drop the reference to it (the device is realized). Copies the data
* from @init_rom to the beginning of the EEPROM memory buffer.
*/
-I2CSlave *at24c_eeprom_init_rom(I2CBus *bus, uint8_t address, uint32_t rom_size,
+I2CSlave *at24c_eeprom_init_rom(Object *parent, I2CBus *bus, uint8_t address,
+ uint32_t rom_size,
const uint8_t *init_rom, uint32_t init_rom_size);
#endif
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 074/134] hw/i386/pc: Give pcspk a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (72 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 073/134] hw/nvram/at24c: Give at24c_eeprom_init() a QOM parent Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-13 8:34 ` Philippe Mathieu-Daudé
2026-07-11 22:36 ` [RFC PATCH 075/134] hw/timer, hw/net: Give i8254 and isa-ne2000 helpers " Alexander Graf
` (60 subsequent siblings)
134 siblings, 1 reply; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
pcspk was created in pc_machine_initfn() as an orphan and manually
unref'd in pc_machine_finalize() when the machine was never realized
(e.g. -M pc,help). Making it a child<> of the machine at creation
time lets the QOM property teardown in object_property_del_all()
handle that lifecycle for free, so pc_machine_finalize() and its
open-coded refcount juggling can go.
The realize path switches from isa_realize_and_unref() to plain
qdev_realize() because the reference is now held by the parent's
child<> property, not the caller.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/i386/pc.c | 14 ++------------
1 file changed, 2 insertions(+), 12 deletions(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 0c89310ab7..a00d53b582 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1128,7 +1128,7 @@ void pc_basic_device_init(struct PCMachineState *pcms,
}
object_property_set_link(OBJECT(pcms->pcspk), "pit",
OBJECT(pit), &error_fatal);
- isa_realize_and_unref(pcms->pcspk, isa_bus, &error_fatal);
+ qdev_realize(DEVICE(pcms->pcspk), BUS(isa_bus), &error_fatal);
}
if (pcms->vmport == ON_OFF_AUTO_AUTO) {
@@ -1640,7 +1640,7 @@ static void pc_machine_initfn(Object *obj)
pcms->default_bus_bypass_iommu = false;
pc_system_flash_create(pcms);
- pcms->pcspk = isa_new_orphan(TYPE_PC_SPEAKER);
+ pcms->pcspk = isa_new(obj, "pcspk", TYPE_PC_SPEAKER);
object_property_add_alias(OBJECT(pcms), "pcspk-audiodev",
OBJECT(pcms->pcspk), "audiodev");
if (pcmc->pci_enabled) {
@@ -1648,15 +1648,6 @@ static void pc_machine_initfn(Object *obj)
}
}
-static void pc_machine_finalize(Object *obj)
-{
- PCMachineState *pcms = PC_MACHINE(obj);
-
- if (pcms->pcspk && !qdev_is_realized(DEVICE(pcms->pcspk))) {
- object_unref(OBJECT(pcms->pcspk));
- }
-}
-
static void pc_machine_reset(MachineState *machine, ResetType type)
{
CPUState *cs;
@@ -1795,7 +1786,6 @@ static const TypeInfo pc_machine_info = {
.abstract = true,
.instance_size = sizeof(PCMachineState),
.instance_init = pc_machine_initfn,
- .instance_finalize = pc_machine_finalize,
.class_size = sizeof(PCMachineClass),
.class_init = pc_machine_class_init,
.interfaces = (const InterfaceInfo[]) {
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 074/134] hw/i386/pc: Give pcspk a QOM parent
2026-07-11 22:36 ` [RFC PATCH 074/134] hw/i386/pc: Give pcspk " Alexander Graf
@ 2026-07-13 8:34 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 156+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-07-13 8:34 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
On 12/7/26 00:36, Alexander Graf wrote:
> pcspk was created in pc_machine_initfn() as an orphan and manually
> unref'd in pc_machine_finalize() when the machine was never realized
> (e.g. -M pc,help). Making it a child<> of the machine at creation
> time lets the QOM property teardown in object_property_del_all()
> handle that lifecycle for free, so pc_machine_finalize() and its
> open-coded refcount juggling can go.
>
> The realize path switches from isa_realize_and_unref() to plain
> qdev_realize() because the reference is now held by the parent's
> child<> property, not the caller.
Nice.
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> hw/i386/pc.c | 14 ++------------
> 1 file changed, 2 insertions(+), 12 deletions(-)
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 075/134] hw/timer, hw/net: Give i8254 and isa-ne2000 helpers a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (73 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 074/134] hw/i386/pc: Give pcspk " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 076/134] hw/misc/unimp: Give create_unimplemented_device() " Alexander Graf
` (59 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
The i8254_pit_init(), kvm_pit_init() and isa_ne2000_init() inline
helpers still created their ISA device as an orphan. Thread an
Object *parent through and switch to isa_new()/isa_try_new() with
qdev_realize().
While at it, drop the dead vmport_init() inline: it has had no
callers since vmmouse got a proper board-level creator, and it was
the last user of isa_create_simple_orphan() outside the ISA layer
itself.
Callers pick the composition-tree owner:
hw/i386/pc.c pcms (board)
hw/i386/microvm.c mms (board)
hw/isa/piix.c d (south-bridge realize)
hw/isa/i82378.c dev (bridge realize)
hw/isa/vt82c686.c d (super-io realize)
hw/mips/jazz.c machine (board)
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/i386/microvm.c | 4 ++--
hw/i386/pc.c | 6 +++---
hw/isa/i82378.c | 2 +-
hw/isa/piix.c | 2 +-
hw/isa/vt82c686.c | 2 +-
hw/mips/jazz.c | 2 +-
include/hw/i386/vmport.h | 5 -----
include/hw/net/ne2000-isa.h | 8 ++++----
include/hw/timer/i8254.h | 13 +++++++------
9 files changed, 20 insertions(+), 24 deletions(-)
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index d701672c1a..8c61106516 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -261,9 +261,9 @@ static void microvm_devices_init(MicrovmMachineState *mms)
if (x86ms->pit == ON_OFF_AUTO_ON || x86ms->pit == ON_OFF_AUTO_AUTO) {
if (kvm_pit_in_kernel()) {
- kvm_pit_init(isa_bus, 0x40);
+ kvm_pit_init(OBJECT(mms), isa_bus, 0x40);
} else {
- i8254_pit_init(isa_bus, 0x40, 0, NULL);
+ i8254_pit_init(OBJECT(mms), isa_bus, 0x40, 0, NULL);
}
}
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index a00d53b582..e505391985 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -505,7 +505,7 @@ static gboolean pc_init_ne2k_isa(ISABus *bus, NICInfo *nd, Error **errp)
"maximum number of ISA NE2000 devices exceeded");
return false;
}
- isa_ne2000_init(bus, ne2000_io[nb_ne2k],
+ isa_ne2000_init(qdev_get_machine(), bus, ne2000_io[nb_ne2k],
ne2000_irq[nb_ne2k], nd);
nb_ne2k++;
return true;
@@ -1118,9 +1118,9 @@ void pc_basic_device_init(struct PCMachineState *pcms,
if (!xen_enabled() &&
(x86ms->pit == ON_OFF_AUTO_AUTO || x86ms->pit == ON_OFF_AUTO_ON)) {
if (kvm_pit_in_kernel()) {
- pit = kvm_pit_init(isa_bus, 0x40);
+ pit = kvm_pit_init(OBJECT(pcms), isa_bus, 0x40);
} else {
- pit = i8254_pit_init(isa_bus, 0x40, pit_isa_irq, pit_alt_irq);
+ pit = i8254_pit_init(OBJECT(pcms), isa_bus, 0x40, pit_isa_irq, pit_alt_irq);
}
if (hpet) {
/* connect PIT to output control line of the HPET */
diff --git a/hw/isa/i82378.c b/hw/isa/i82378.c
index 1c0a6ad779..995d1eaa53 100644
--- a/hw/isa/i82378.c
+++ b/hw/isa/i82378.c
@@ -100,7 +100,7 @@ static void i82378_realize(PCIDevice *pci, Error **errp)
isa_bus_register_input_irqs(isabus, s->isa_irqs_in);
/* 1 82C54 (pit) */
- pit = i8254_pit_init(isabus, 0x40, 0, NULL);
+ pit = i8254_pit_init(OBJECT(dev), isabus, 0x40, 0, NULL);
/* speaker */
pcspk = isa_new(OBJECT(s), "pcspk", TYPE_PC_SPEAKER);
diff --git a/hw/isa/piix.c b/hw/isa/piix.c
index 6b2946d82c..d96bc3a873 100644
--- a/hw/isa/piix.c
+++ b/hw/isa/piix.c
@@ -334,7 +334,7 @@ static void pci_piix_realize(PCIDevice *dev, const char *uhci_type,
/* PIT */
if (d->has_pit) {
- i8254_pit_init(isa_bus, 0x40, 0, NULL);
+ i8254_pit_init(OBJECT(d), isa_bus, 0x40, 0, NULL);
}
i8257_dma_init(OBJECT(dev), isa_bus, 0);
diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c
index de9006bd95..2337c3115b 100644
--- a/hw/isa/vt82c686.c
+++ b/hw/isa/vt82c686.c
@@ -732,7 +732,7 @@ static void via_isa_realize(PCIDevice *d, Error **errp)
s->isa_irqs_in = i8259_init(OBJECT(d), isa_bus, &s->i8259_irq);
isa_bus_register_input_irqs(isa_bus, s->isa_irqs_in);
- i8254_pit_init(isa_bus, 0x40, 0, NULL);
+ i8254_pit_init(OBJECT(d), isa_bus, 0x40, 0, NULL);
i8257_dma_init(OBJECT(d), isa_bus, 0);
/* RTC */
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index 208e59fbeb..23d717d96a 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -289,7 +289,7 @@ static void mips_jazz_init(MachineState *machine,
i8259 = i8259_init(OBJECT(machine), isa_bus, env->irq[4]);
isa_bus_register_input_irqs(isa_bus, i8259);
i8257_dma_init(OBJECT(rc4030), isa_bus, 0);
- pit = i8254_pit_init(isa_bus, 0x40, 0, NULL);
+ pit = i8254_pit_init(OBJECT(machine), isa_bus, 0x40, 0, NULL);
pcspk = isa_new(OBJECT(machine), "pcspk", TYPE_PC_SPEAKER);
object_property_set_link(OBJECT(pcspk), "pit", OBJECT(pit), &error_fatal);
qdev_realize(DEVICE(pcspk), BUS(isa_bus), &error_fatal);
diff --git a/include/hw/i386/vmport.h b/include/hw/i386/vmport.h
index 22dd3645d2..02e422029d 100644
--- a/include/hw/i386/vmport.h
+++ b/include/hw/i386/vmport.h
@@ -18,11 +18,6 @@ typedef enum {
VMPORT_ENTRIES
} VMPortCommand;
-static inline void vmport_init(ISABus *bus)
-{
- isa_create_simple_orphan(bus, TYPE_VMPORT);
-}
-
void vmport_register(VMPortCommand command, VMPortReadFunc *func, void *opaque);
#endif
diff --git a/include/hw/net/ne2000-isa.h b/include/hw/net/ne2000-isa.h
index ef8b3334d7..f504a03db7 100644
--- a/include/hw/net/ne2000-isa.h
+++ b/include/hw/net/ne2000-isa.h
@@ -17,19 +17,19 @@
#define TYPE_ISA_NE2000 "ne2k_isa"
-static inline ISADevice *isa_ne2000_init(ISABus *bus, int base, int irq,
- NICInfo *nd)
+static inline ISADevice *isa_ne2000_init(Object *parent, ISABus *bus,
+ int base, int irq, NICInfo *nd)
{
ISADevice *d;
- d = isa_try_new_orphan(TYPE_ISA_NE2000);
+ d = isa_try_new(parent, "ne2k[*]", TYPE_ISA_NE2000);
if (d) {
DeviceState *dev = DEVICE(d);
qdev_prop_set_uint32(dev, "iobase", base);
qdev_prop_set_uint32(dev, "irq", irq);
qdev_set_nic_properties(dev, nd);
- isa_realize_and_unref(d, bus, &error_fatal);
+ qdev_realize(dev, BUS(bus), &error_fatal);
}
return d;
}
diff --git a/include/hw/timer/i8254.h b/include/hw/timer/i8254.h
index 38f896063e..b7bc98b688 100644
--- a/include/hw/timer/i8254.h
+++ b/include/hw/timer/i8254.h
@@ -45,16 +45,17 @@ OBJECT_DECLARE_TYPE(PITCommonState, PITCommonClass, PIT_COMMON)
#define TYPE_I8254 "isa-pit"
#define TYPE_KVM_I8254 "kvm-pit"
-static inline ISADevice *i8254_pit_init(ISABus *bus, int base, int isa_irq,
+static inline ISADevice *i8254_pit_init(Object *parent, ISABus *bus,
+ int base, int isa_irq,
qemu_irq alt_irq)
{
DeviceState *dev;
ISADevice *d;
- d = isa_new_orphan(TYPE_I8254);
+ d = isa_new(parent, "pit[*]", TYPE_I8254);
dev = DEVICE(d);
qdev_prop_set_uint32(dev, "iobase", base);
- isa_realize_and_unref(d, bus, &error_fatal);
+ qdev_realize(dev, BUS(bus), &error_fatal);
qdev_connect_gpio_out(dev, 0,
isa_irq >= 0 ? isa_bus_get_irq(bus, isa_irq)
: alt_irq);
@@ -62,15 +63,15 @@ static inline ISADevice *i8254_pit_init(ISABus *bus, int base, int isa_irq,
return d;
}
-static inline ISADevice *kvm_pit_init(ISABus *bus, int base)
+static inline ISADevice *kvm_pit_init(Object *parent, ISABus *bus, int base)
{
DeviceState *dev;
ISADevice *d;
- d = isa_new_orphan(TYPE_KVM_I8254);
+ d = isa_new(parent, "pit[*]", TYPE_KVM_I8254);
dev = DEVICE(d);
qdev_prop_set_uint32(dev, "iobase", base);
- isa_realize_and_unref(d, bus, &error_fatal);
+ qdev_realize(dev, BUS(bus), &error_fatal);
return d;
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 076/134] hw/misc/unimp: Give create_unimplemented_device() a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (74 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 075/134] hw/timer, hw/net: Give i8254 and isa-ne2000 helpers " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 077/134] hw/usb: Give -usbdevice and auto-hub devices " Alexander Graf
` (58 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Every one of the ~500 call sites already sits inside a SoC .realize()
or a board .init() where the natural composition-tree owner is in
scope. Thread that owner through as the first argument, reuse the
existing @name string as the child<> id, and switch the internal
qdev_new_orphan()+sysbus_realize_and_unref() pair to the parented
qdev_new()+sysbus_realize().
Parent expression per caller class:
*_realize(DeviceState *dev, ...) OBJECT(dev)
*_soc_realize(DeviceState *dev_soc,) OBJECT(dev_soc)
board_init(MachineState *machine) OBJECT(machine) / OBJECT(ms) etc.
No behavioural change: the low-priority overlap mapping still lets
real device models take precedence. All 20 softmmu targets build.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/allwinner-a10.c | 2 +-
hw/arm/allwinner-h3.c | 2 +-
hw/arm/allwinner-r40.c | 2 +-
hw/arm/fsl-imx6.c | 2 +-
hw/arm/fsl-imx6ul.c | 35 +++---
hw/arm/fsl-imx7.c | 33 +++---
hw/arm/fsl-imx8mm.c | 2 +-
hw/arm/fsl-imx8mp.c | 2 +-
hw/arm/max78000_soc.c | 105 ++++++++--------
hw/arm/mps2-tz.c | 7 +-
hw/arm/mps2.c | 27 +++--
hw/arm/mps3r.c | 10 +-
hw/arm/msf2-soc.c | 20 ++--
hw/arm/npcm7xx.c | 91 +++++++-------
hw/arm/npcm8xx.c | 145 ++++++++++++-----------
hw/arm/nrf51_soc.c | 4 +-
hw/arm/stellaris.c | 12 +-
hw/arm/stm32f100_soc.c | 60 +++++-----
hw/arm/stm32f405_soc.c | 84 ++++++-------
hw/arm/stm32l4x5_soc.c | 88 +++++++-------
hw/arm/xilinx_zynq.c | 61 +++++-----
hw/avr/atmega.c | 20 ++--
hw/loongarch/virt.c | 2 +-
hw/microblaze/petalogix_s3adsp1800_mmu.c | 2 +-
hw/mips/loongson3_virt.c | 5 +-
hw/pci-host/bonito.c | 14 +--
hw/riscv/k230.c | 107 ++++++++---------
hw/riscv/microblaze-v-generic.c | 10 +-
hw/riscv/microchip_pfsoc.c | 54 ++++-----
hw/riscv/opentitan.c | 52 ++++----
hw/riscv/sifive_e.c | 12 +-
hw/riscv/sifive_u.c | 6 +-
hw/riscv/tt_atlantis.c | 2 +-
hw/sparc/sun4m.c | 8 +-
hw/sparc64/niagara.c | 3 +-
include/hw/misc/unimp.h | 9 +-
36 files changed, 557 insertions(+), 543 deletions(-)
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
index cbc0b38986..8b37fd61f3 100644
--- a/hw/arm/allwinner-a10.c
+++ b/hw/arm/allwinner-a10.c
@@ -131,7 +131,7 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
memory_region_init_ram(&s->sram_a, OBJECT(dev), "sram A", 48 * KiB,
&error_fatal);
memory_region_add_subregion(get_system_memory(), 0x00000000, &s->sram_a);
- create_unimplemented_device("a10-sram-ctrl", 0x01c00000, 4 * KiB);
+ create_unimplemented_device(OBJECT(dev), "a10-sram-ctrl", 0x01c00000, 4 * KiB);
/* Clock Control Module */
sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &error_fatal);
diff --git a/hw/arm/allwinner-h3.c b/hw/arm/allwinner-h3.c
index 6f9a07610f..711bfae095 100644
--- a/hw/arm/allwinner-h3.c
+++ b/hw/arm/allwinner-h3.c
@@ -468,7 +468,7 @@ static void allwinner_h3_realize(DeviceState *dev, Error **errp)
/* Unimplemented devices */
for (i = 0; i < ARRAY_SIZE(unimplemented); i++) {
- create_unimplemented_device(unimplemented[i].device_name,
+ create_unimplemented_device(OBJECT(dev), unimplemented[i].device_name,
unimplemented[i].base,
unimplemented[i].size);
}
diff --git a/hw/arm/allwinner-r40.c b/hw/arm/allwinner-r40.c
index 4f9d8a606e..9c15d361b4 100644
--- a/hw/arm/allwinner-r40.c
+++ b/hw/arm/allwinner-r40.c
@@ -532,7 +532,7 @@ static void allwinner_r40_realize(DeviceState *dev, Error **errp)
/* Unimplemented devices */
for (unsigned i = 0; i < ARRAY_SIZE(r40_unimplemented); i++) {
- create_unimplemented_device(r40_unimplemented[i].device_name,
+ create_unimplemented_device(OBJECT(dev), r40_unimplemented[i].device_name,
r40_unimplemented[i].base,
r40_unimplemented[i].size);
}
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index 44046953be..f0fbdc1a68 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -471,7 +471,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
/*
* PCIe PHY
*/
- create_unimplemented_device("pcie-phy", FSL_IMX6_PCIe_ADDR,
+ create_unimplemented_device(OBJECT(dev), "pcie-phy", FSL_IMX6_PCIe_ADDR,
FSL_IMX6_PCIe_SIZE);
/* ROM memory */
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
index 1863558a0d..adbb896fd1 100644
--- a/hw/arm/fsl-imx6ul.c
+++ b/hw/arm/fsl-imx6ul.c
@@ -161,6 +161,7 @@ static void fsl_imx6ul_init(Object *obj)
static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
{
+ Object *obj = OBJECT(dev);
MachineState *ms = MACHINE(qdev_get_machine());
FslIMX6ULState *s = FSL_IMX6UL(dev);
DeviceState *mpcore = DEVICE(&s->a7mpcore);
@@ -198,37 +199,37 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
/*
* A7MPCORE DAP
*/
- create_unimplemented_device("a7mpcore-dap", FSL_IMX6UL_A7MPCORE_DAP_ADDR,
+ create_unimplemented_device(obj, "a7mpcore-dap", FSL_IMX6UL_A7MPCORE_DAP_ADDR,
FSL_IMX6UL_A7MPCORE_DAP_SIZE);
/*
* MMDC
*/
- create_unimplemented_device("a7mpcore-mmdc", FSL_IMX6UL_MMDC_CFG_ADDR,
+ create_unimplemented_device(obj, "a7mpcore-mmdc", FSL_IMX6UL_MMDC_CFG_ADDR,
FSL_IMX6UL_MMDC_CFG_SIZE);
/*
* OCOTP
*/
- create_unimplemented_device("a7mpcore-ocotp", FSL_IMX6UL_OCOTP_CTRL_ADDR,
+ create_unimplemented_device(obj, "a7mpcore-ocotp", FSL_IMX6UL_OCOTP_CTRL_ADDR,
FSL_IMX6UL_OCOTP_CTRL_SIZE);
/*
* QSPI
*/
- create_unimplemented_device("a7mpcore-qspi", FSL_IMX6UL_QSPI_ADDR,
+ create_unimplemented_device(obj, "a7mpcore-qspi", FSL_IMX6UL_QSPI_ADDR,
FSL_IMX6UL_QSPI_SIZE);
/*
* CAAM
*/
- create_unimplemented_device("a7mpcore-qspi", FSL_IMX6UL_CAAM_ADDR,
+ create_unimplemented_device(obj, "a7mpcore-qspi", FSL_IMX6UL_CAAM_ADDR,
FSL_IMX6UL_CAAM_SIZE);
/*
* USBMISC
*/
- create_unimplemented_device("a7mpcore-usbmisc", FSL_IMX6UL_USBO2_USBMISC_ADDR,
+ create_unimplemented_device(obj, "a7mpcore-usbmisc", FSL_IMX6UL_USBO2_USBMISC_ADDR,
FSL_IMX6UL_USBO2_USBMISC_SIZE);
/*
@@ -322,9 +323,9 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
/*
* IOMUXC
*/
- create_unimplemented_device("iomuxc", FSL_IMX6UL_IOMUXC_ADDR,
+ create_unimplemented_device(obj, "iomuxc", FSL_IMX6UL_IOMUXC_ADDR,
FSL_IMX6UL_IOMUXC_SIZE);
- create_unimplemented_device("iomuxc_gpr", FSL_IMX6UL_IOMUXC_GPR_ADDR,
+ create_unimplemented_device(obj, "iomuxc_gpr", FSL_IMX6UL_IOMUXC_GPR_ADDR,
FSL_IMX6UL_IOMUXC_GPR_SIZE);
/*
@@ -581,7 +582,7 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
/*
* SDMA
*/
- create_unimplemented_device("sdma", FSL_IMX6UL_SDMA_ADDR,
+ create_unimplemented_device(obj, "sdma", FSL_IMX6UL_SDMA_ADDR,
FSL_IMX6UL_SDMA_SIZE);
/*
@@ -595,7 +596,7 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
};
snprintf(name, NAME_SIZE, "sai%d", i);
- create_unimplemented_device(name, FSL_IMX6UL_SAIn_ADDR[i],
+ create_unimplemented_device(obj, name, FSL_IMX6UL_SAIn_ADDR[i],
FSL_IMX6UL_SAIn_SIZE);
}
@@ -615,14 +616,14 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
};
snprintf(name, NAME_SIZE, "pwm%d", i);
- create_unimplemented_device(name, FSL_IMX6UL_PWMn_ADDR[i],
+ create_unimplemented_device(obj, name, FSL_IMX6UL_PWMn_ADDR[i],
FSL_IMX6UL_PWMn_SIZE);
}
/*
* Audio ASRC (asynchronous sample rate converter)
*/
- create_unimplemented_device("asrc", FSL_IMX6UL_ASRC_ADDR,
+ create_unimplemented_device(obj, "asrc", FSL_IMX6UL_ASRC_ADDR,
FSL_IMX6UL_ASRC_SIZE);
/*
@@ -635,14 +636,14 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
};
snprintf(name, NAME_SIZE, "can%d", i);
- create_unimplemented_device(name, FSL_IMX6UL_CANn_ADDR[i],
+ create_unimplemented_device(obj, name, FSL_IMX6UL_CANn_ADDR[i],
FSL_IMX6UL_CANn_SIZE);
}
/*
* APHB_DMA
*/
- create_unimplemented_device("aphb_dma", FSL_IMX6UL_APBH_DMA_ADDR,
+ create_unimplemented_device(obj, "aphb_dma", FSL_IMX6UL_APBH_DMA_ADDR,
FSL_IMX6UL_APBH_DMA_SIZE);
/*
@@ -655,7 +656,7 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
};
snprintf(name, NAME_SIZE, "adc%d", i);
- create_unimplemented_device(name, FSL_IMX6UL_ADCn_ADDR[i],
+ create_unimplemented_device(obj, name, FSL_IMX6UL_ADCn_ADDR[i],
FSL_IMX6UL_ADCn_SIZE);
}
@@ -670,13 +671,13 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
/*
* CSU
*/
- create_unimplemented_device("csu", FSL_IMX6UL_CSU_ADDR,
+ create_unimplemented_device(obj, "csu", FSL_IMX6UL_CSU_ADDR,
FSL_IMX6UL_CSU_SIZE);
/*
* TZASC
*/
- create_unimplemented_device("tzasc", FSL_IMX6UL_TZASC_ADDR,
+ create_unimplemented_device(obj, "tzasc", FSL_IMX6UL_TZASC_ADDR,
FSL_IMX6UL_TZASC_SIZE);
/*
diff --git a/hw/arm/fsl-imx7.c b/hw/arm/fsl-imx7.c
index 2defa498d3..07a5ae8cd0 100644
--- a/hw/arm/fsl-imx7.c
+++ b/hw/arm/fsl-imx7.c
@@ -154,6 +154,7 @@ static void fsl_imx7_init(Object *obj)
static void fsl_imx7_realize(DeviceState *dev, Error **errp)
{
+ Object *obj = OBJECT(dev);
MachineState *ms = MACHINE(qdev_get_machine());
FslIMX7State *s = FSL_IMX7(dev);
DeviceState *mpcore = DEVICE(&s->a7mpcore);
@@ -229,7 +230,7 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
/*
* A7MPCORE DAP
*/
- create_unimplemented_device("a7mpcore-dap", FSL_IMX7_A7MPCORE_DAP_ADDR,
+ create_unimplemented_device(obj, "a7mpcore-dap", FSL_IMX7_A7MPCORE_DAP_ADDR,
FSL_IMX7_A7MPCORE_DAP_SIZE);
/*
@@ -305,9 +306,9 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
/*
* IOMUXC and IOMUXC_LPSR
*/
- create_unimplemented_device("iomuxc", FSL_IMX7_IOMUXC_ADDR,
+ create_unimplemented_device(obj, "iomuxc", FSL_IMX7_IOMUXC_ADDR,
FSL_IMX7_IOMUXC_SIZE);
- create_unimplemented_device("iomuxc_lspr", FSL_IMX7_IOMUXC_LPSR_ADDR,
+ create_unimplemented_device(obj, "iomuxc_lspr", FSL_IMX7_IOMUXC_LPSR_ADDR,
FSL_IMX7_IOMUXC_LPSR_SIZE);
/*
@@ -520,12 +521,12 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
/*
* SDMA
*/
- create_unimplemented_device("sdma", FSL_IMX7_SDMA_ADDR, FSL_IMX7_SDMA_SIZE);
+ create_unimplemented_device(obj, "sdma", FSL_IMX7_SDMA_ADDR, FSL_IMX7_SDMA_SIZE);
/*
* CAAM
*/
- create_unimplemented_device("caam", FSL_IMX7_CAAM_ADDR, FSL_IMX7_CAAM_SIZE);
+ create_unimplemented_device(obj, "caam", FSL_IMX7_CAAM_ADDR, FSL_IMX7_CAAM_SIZE);
/*
* PWMs
@@ -539,7 +540,7 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
};
snprintf(name, NAME_SIZE, "pwm%d", i);
- create_unimplemented_device(name, FSL_IMX7_PWMn_ADDR[i],
+ create_unimplemented_device(obj, name, FSL_IMX7_PWMn_ADDR[i],
FSL_IMX7_PWMn_SIZE);
}
@@ -553,7 +554,7 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
};
snprintf(name, NAME_SIZE, "can%d", i);
- create_unimplemented_device(name, FSL_IMX7_CANn_ADDR[i],
+ create_unimplemented_device(obj, name, FSL_IMX7_CANn_ADDR[i],
FSL_IMX7_CANn_SIZE);
}
@@ -568,14 +569,14 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
};
snprintf(name, NAME_SIZE, "sai%d", i);
- create_unimplemented_device(name, FSL_IMX7_SAIn_ADDR[i],
+ create_unimplemented_device(obj, name, FSL_IMX7_SAIn_ADDR[i],
FSL_IMX7_SAIn_SIZE);
}
/*
* OCOTP
*/
- create_unimplemented_device("ocotp", FSL_IMX7_OCOTP_ADDR,
+ create_unimplemented_device(obj, "ocotp", FSL_IMX7_OCOTP_ADDR,
FSL_IMX7_OCOTP_SIZE);
/*
@@ -638,7 +639,7 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
sysbus_connect_irq(SYS_BUS_DEVICE(&s->usb[i]), 0, irq);
snprintf(name, NAME_SIZE, "usbmisc%d", i);
- create_unimplemented_device(name, FSL_IMX7_USBMISCn_ADDR[i],
+ create_unimplemented_device(obj, name, FSL_IMX7_USBMISCn_ADDR[i],
FSL_IMX7_USBMISCn_SIZE);
}
@@ -652,37 +653,37 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
};
snprintf(name, NAME_SIZE, "adc%d", i);
- create_unimplemented_device(name, FSL_IMX7_ADCn_ADDR[i],
+ create_unimplemented_device(obj, name, FSL_IMX7_ADCn_ADDR[i],
FSL_IMX7_ADCn_SIZE);
}
/*
* LCD
*/
- create_unimplemented_device("lcdif", FSL_IMX7_LCDIF_ADDR,
+ create_unimplemented_device(obj, "lcdif", FSL_IMX7_LCDIF_ADDR,
FSL_IMX7_LCDIF_SIZE);
/*
* DMA APBH
*/
- create_unimplemented_device("dma-apbh", FSL_IMX7_DMA_APBH_ADDR,
+ create_unimplemented_device(obj, "dma-apbh", FSL_IMX7_DMA_APBH_ADDR,
FSL_IMX7_DMA_APBH_SIZE);
/*
* PCIe PHY
*/
- create_unimplemented_device("pcie-phy", FSL_IMX7_PCIE_PHY_ADDR,
+ create_unimplemented_device(obj, "pcie-phy", FSL_IMX7_PCIE_PHY_ADDR,
FSL_IMX7_PCIE_PHY_SIZE);
/*
* CSU
*/
- create_unimplemented_device("csu", FSL_IMX7_CSU_ADDR,
+ create_unimplemented_device(obj, "csu", FSL_IMX7_CSU_ADDR,
FSL_IMX7_CSU_SIZE);
/*
* TZASC
*/
- create_unimplemented_device("tzasc", FSL_IMX7_TZASC_ADDR,
+ create_unimplemented_device(obj, "tzasc", FSL_IMX7_TZASC_ADDR,
FSL_IMX7_TZASC_SIZE);
/*
diff --git a/hw/arm/fsl-imx8mm.c b/hw/arm/fsl-imx8mm.c
index 875e92bb34..a38298c4a6 100644
--- a/hw/arm/fsl-imx8mm.c
+++ b/hw/arm/fsl-imx8mm.c
@@ -669,7 +669,7 @@ static void fsl_imx8mm_realize(DeviceState *dev, Error **errp)
break;
default:
- create_unimplemented_device(fsl_imx8mm_memmap[i].name,
+ create_unimplemented_device(OBJECT(dev), fsl_imx8mm_memmap[i].name,
fsl_imx8mm_memmap[i].addr,
fsl_imx8mm_memmap[i].size);
break;
diff --git a/hw/arm/fsl-imx8mp.c b/hw/arm/fsl-imx8mp.c
index bcd91739d9..c5bace6605 100644
--- a/hw/arm/fsl-imx8mp.c
+++ b/hw/arm/fsl-imx8mp.c
@@ -738,7 +738,7 @@ static void fsl_imx8mp_realize(DeviceState *dev, Error **errp)
break;
default:
- create_unimplemented_device(fsl_imx8mp_memmap[i].name,
+ create_unimplemented_device(OBJECT(dev), fsl_imx8mp_memmap[i].name,
fsl_imx8mp_memmap[i].addr,
fsl_imx8mp_memmap[i].size);
break;
diff --git a/hw/arm/max78000_soc.c b/hw/arm/max78000_soc.c
index 321e63723e..b8e0265de2 100644
--- a/hw/arm/max78000_soc.c
+++ b/hw/arm/max78000_soc.c
@@ -52,6 +52,7 @@ static void max78000_soc_initfn(Object *obj)
static void max78000_soc_realize(DeviceState *dev_soc, Error **errp)
{
+ Object *obj = OBJECT(dev_soc);
MAX78000State *s = MAX78000_SOC(dev_soc);
MemoryRegion *system_memory = get_system_memory();
DeviceState *dev, *gcrdev, *armv7m;
@@ -146,52 +147,52 @@ static void max78000_soc_realize(DeviceState *dev_soc, Error **errp)
sysbus_realize(SYS_BUS_DEVICE(dev), errp);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x40000000);
- create_unimplemented_device("systemInterface", 0x40000400, 0x400);
- create_unimplemented_device("functionControl", 0x40000800, 0x400);
- create_unimplemented_device("watchdogTimer0", 0x40003000, 0x400);
- create_unimplemented_device("dynamicVoltScale", 0x40003c00, 0x40);
- create_unimplemented_device("SIMO", 0x40004400, 0x400);
- create_unimplemented_device("trimSystemInit", 0x40005400, 0x400);
- create_unimplemented_device("generalCtrlFunc", 0x40005800, 0x400);
- create_unimplemented_device("wakeupTimer", 0x40006400, 0x400);
- create_unimplemented_device("powerSequencer", 0x40006800, 0x400);
- create_unimplemented_device("miscControl", 0x40006c00, 0x400);
-
- create_unimplemented_device("gpio0", 0x40008000, 0x1000);
- create_unimplemented_device("gpio1", 0x40009000, 0x1000);
-
- create_unimplemented_device("parallelCamInterface", 0x4000e000, 0x1000);
- create_unimplemented_device("CRC", 0x4000f000, 0x1000);
-
- create_unimplemented_device("timer0", 0x40010000, 0x1000);
- create_unimplemented_device("timer1", 0x40011000, 0x1000);
- create_unimplemented_device("timer2", 0x40012000, 0x1000);
- create_unimplemented_device("timer3", 0x40013000, 0x1000);
-
- create_unimplemented_device("i2c0", 0x4001d000, 0x1000);
- create_unimplemented_device("i2c1", 0x4001e000, 0x1000);
- create_unimplemented_device("i2c2", 0x4001f000, 0x1000);
-
- create_unimplemented_device("standardDMA", 0x40028000, 0x1000);
- create_unimplemented_device("flashController0", 0x40029000, 0x400);
-
- create_unimplemented_device("adc", 0x40034000, 0x1000);
- create_unimplemented_device("pulseTrainEngine", 0x4003c000, 0xa0);
- create_unimplemented_device("oneWireMaster", 0x4003d000, 0x1000);
- create_unimplemented_device("semaphore", 0x4003e000, 0x1000);
-
- create_unimplemented_device("spi1", 0x40046000, 0x2000);
- create_unimplemented_device("i2s", 0x40060000, 0x1000);
- create_unimplemented_device("lowPowerControl", 0x40080000, 0x400);
- create_unimplemented_device("gpio2", 0x40080400, 0x200);
- create_unimplemented_device("lowPowerWatchdogTimer", 0x40080800, 0x400);
- create_unimplemented_device("lowPowerTimer4", 0x40080c00, 0x400);
-
- create_unimplemented_device("lowPowerTimer5", 0x40081000, 0x400);
- create_unimplemented_device("lowPowerUART0", 0x40081400, 0x400);
- create_unimplemented_device("lowPowerComparator", 0x40088000, 0x400);
-
- create_unimplemented_device("spi0", 0x400be000, 0x400);
+ create_unimplemented_device(obj, "systemInterface", 0x40000400, 0x400);
+ create_unimplemented_device(obj, "functionControl", 0x40000800, 0x400);
+ create_unimplemented_device(obj, "watchdogTimer0", 0x40003000, 0x400);
+ create_unimplemented_device(obj, "dynamicVoltScale", 0x40003c00, 0x40);
+ create_unimplemented_device(obj, "SIMO", 0x40004400, 0x400);
+ create_unimplemented_device(obj, "trimSystemInit", 0x40005400, 0x400);
+ create_unimplemented_device(obj, "generalCtrlFunc", 0x40005800, 0x400);
+ create_unimplemented_device(obj, "wakeupTimer", 0x40006400, 0x400);
+ create_unimplemented_device(obj, "powerSequencer", 0x40006800, 0x400);
+ create_unimplemented_device(obj, "miscControl", 0x40006c00, 0x400);
+
+ create_unimplemented_device(obj, "gpio0", 0x40008000, 0x1000);
+ create_unimplemented_device(obj, "gpio1", 0x40009000, 0x1000);
+
+ create_unimplemented_device(obj, "parallelCamInterface", 0x4000e000, 0x1000);
+ create_unimplemented_device(obj, "CRC", 0x4000f000, 0x1000);
+
+ create_unimplemented_device(obj, "timer0", 0x40010000, 0x1000);
+ create_unimplemented_device(obj, "timer1", 0x40011000, 0x1000);
+ create_unimplemented_device(obj, "timer2", 0x40012000, 0x1000);
+ create_unimplemented_device(obj, "timer3", 0x40013000, 0x1000);
+
+ create_unimplemented_device(obj, "i2c0", 0x4001d000, 0x1000);
+ create_unimplemented_device(obj, "i2c1", 0x4001e000, 0x1000);
+ create_unimplemented_device(obj, "i2c2", 0x4001f000, 0x1000);
+
+ create_unimplemented_device(obj, "standardDMA", 0x40028000, 0x1000);
+ create_unimplemented_device(obj, "flashController0", 0x40029000, 0x400);
+
+ create_unimplemented_device(obj, "adc", 0x40034000, 0x1000);
+ create_unimplemented_device(obj, "pulseTrainEngine", 0x4003c000, 0xa0);
+ create_unimplemented_device(obj, "oneWireMaster", 0x4003d000, 0x1000);
+ create_unimplemented_device(obj, "semaphore", 0x4003e000, 0x1000);
+
+ create_unimplemented_device(obj, "spi1", 0x40046000, 0x2000);
+ create_unimplemented_device(obj, "i2s", 0x40060000, 0x1000);
+ create_unimplemented_device(obj, "lowPowerControl", 0x40080000, 0x400);
+ create_unimplemented_device(obj, "gpio2", 0x40080400, 0x200);
+ create_unimplemented_device(obj, "lowPowerWatchdogTimer", 0x40080800, 0x400);
+ create_unimplemented_device(obj, "lowPowerTimer4", 0x40080c00, 0x400);
+
+ create_unimplemented_device(obj, "lowPowerTimer5", 0x40081000, 0x400);
+ create_unimplemented_device(obj, "lowPowerUART0", 0x40081400, 0x400);
+ create_unimplemented_device(obj, "lowPowerComparator", 0x40088000, 0x400);
+
+ create_unimplemented_device(obj, "spi0", 0x400be000, 0x400);
/*
* The MAX78000 user guide's base address map lists the CNN TX FIFO as
@@ -199,13 +200,13 @@ static void max78000_soc_realize(DeviceState *dev_soc, Error **errp)
* is listed as having data accessible up to offset 0x1000, the user
* guide is likely incorrect.
*/
- create_unimplemented_device("cnnTxFIFO", 0x400c0400, 0x2000);
+ create_unimplemented_device(obj, "cnnTxFIFO", 0x400c0400, 0x2000);
- create_unimplemented_device("cnnGlobalControl", 0x50000000, 0x10000);
- create_unimplemented_device("cnnx16quad0", 0x50100000, 0x40000);
- create_unimplemented_device("cnnx16quad1", 0x50500000, 0x40000);
- create_unimplemented_device("cnnx16quad2", 0x50900000, 0x40000);
- create_unimplemented_device("cnnx16quad3", 0x50d00000, 0x40000);
+ create_unimplemented_device(obj, "cnnGlobalControl", 0x50000000, 0x10000);
+ create_unimplemented_device(obj, "cnnx16quad0", 0x50100000, 0x40000);
+ create_unimplemented_device(obj, "cnnx16quad1", 0x50500000, 0x40000);
+ create_unimplemented_device(obj, "cnnx16quad2", 0x50900000, 0x40000);
+ create_unimplemented_device(obj, "cnnx16quad3", 0x50d00000, 0x40000);
}
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
index 17945d2b71..32e3db1134 100644
--- a/hw/arm/mps2-tz.c
+++ b/hw/arm/mps2-tz.c
@@ -800,6 +800,7 @@ static uint32_t boot_ram_size(MPS2TZMachineState *mms)
static void mps2tz_common_init(MachineState *machine)
{
+ Object *obj = OBJECT(machine);
MPS2TZMachineState *mms = MPS2TZ_MACHINE(machine);
MPS2TZMachineClass *mmc = MPS2TZ_MACHINE_GET_CLASS(mms);
MachineClass *mc = MACHINE_GET_CLASS(machine);
@@ -1193,11 +1194,11 @@ static void mps2tz_common_init(MachineState *machine)
"cfg_sec_resp", 0));
}
- create_unimplemented_device("FPGA NS PC", 0x48007000, 0x1000);
+ create_unimplemented_device(obj, "FPGA NS PC", 0x48007000, 0x1000);
if (mmc->fpga_type == FPGA_AN547) {
- create_unimplemented_device("U55 timing adapter 0", 0x48102000, 0x1000);
- create_unimplemented_device("U55 timing adapter 1", 0x48103000, 0x1000);
+ create_unimplemented_device(obj, "U55 timing adapter 0", 0x48102000, 0x1000);
+ create_unimplemented_device(obj, "U55 timing adapter 1", 0x48103000, 0x1000);
}
create_non_mpc_ram(mms);
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
index 2edd222674..23a814e4e4 100644
--- a/hw/arm/mps2.c
+++ b/hw/arm/mps2.c
@@ -135,6 +135,7 @@ static void make_ram_alias(MemoryRegion *mr, const char *name,
static void mps2_common_init(MachineState *machine)
{
+ Object *obj = OBJECT(machine);
MPS2MachineState *mms = MPS2_MACHINE(machine);
MPS2MachineClass *mmc = MPS2_MACHINE_GET_CLASS(machine);
MemoryRegion *system_memory = get_system_memory();
@@ -246,25 +247,25 @@ static void mps2_common_init(MachineState *machine)
OBJECT(system_memory), &error_abort);
sysbus_realize(SYS_BUS_DEVICE(&mms->armv7m), &error_fatal);
- create_unimplemented_device("zbtsmram mirror", 0x00400000, 0x00400000);
- create_unimplemented_device("RESERVED 1", 0x00800000, 0x00800000);
- create_unimplemented_device("Block RAM", 0x01000000, 0x00010000);
- create_unimplemented_device("RESERVED 2", 0x01010000, 0x1EFF0000);
- create_unimplemented_device("RESERVED 3", 0x20800000, 0x00800000);
- create_unimplemented_device("PSRAM", 0x21000000, 0x01000000);
+ create_unimplemented_device(obj, "zbtsmram mirror", 0x00400000, 0x00400000);
+ create_unimplemented_device(obj, "RESERVED 1", 0x00800000, 0x00800000);
+ create_unimplemented_device(obj, "Block RAM", 0x01000000, 0x00010000);
+ create_unimplemented_device(obj, "RESERVED 2", 0x01010000, 0x1EFF0000);
+ create_unimplemented_device(obj, "RESERVED 3", 0x20800000, 0x00800000);
+ create_unimplemented_device(obj, "PSRAM", 0x21000000, 0x01000000);
/* These three ranges all cover multiple devices; we may implement
* some of them below (in which case the real device takes precedence
* over the unimplemented-region mapping).
*/
- create_unimplemented_device("CMSDK APB peripheral region @0x40000000",
+ create_unimplemented_device(obj, "CMSDK APB peripheral region @0x40000000",
0x40000000, 0x00010000);
- create_unimplemented_device("CMSDK AHB peripheral region @0x40010000",
+ create_unimplemented_device(obj, "CMSDK AHB peripheral region @0x40010000",
0x40010000, 0x00010000);
- create_unimplemented_device("Extra peripheral region @0x40020000",
+ create_unimplemented_device(obj, "Extra peripheral region @0x40020000",
0x40020000, 0x00010000);
- create_unimplemented_device("RESERVED 4", 0x40030000, 0x001D0000);
- create_unimplemented_device("VGA", 0x41000000, 0x0200000);
+ create_unimplemented_device(obj, "RESERVED 4", 0x40030000, 0x001D0000);
+ create_unimplemented_device(obj, "VGA", 0x41000000, 0x0200000);
switch (mmc->fpga_type) {
case FPGA_AN385:
@@ -362,7 +363,7 @@ static void mps2_common_init(MachineState *machine)
for (i = 0; i < 4; i++) {
static const hwaddr gpiobase[] = {0x40010000, 0x40011000,
0x40012000, 0x40013000};
- create_unimplemented_device("cmsdk-ahb-gpio", gpiobase[i], 0x1000);
+ create_unimplemented_device(obj, "cmsdk-ahb-gpio", gpiobase[i], 0x1000);
}
/* CMSDK APB subsystem */
@@ -458,7 +459,7 @@ static void mps2_common_init(MachineState *machine)
qbus_mark_full(qbus);
}
}
- create_unimplemented_device("i2s", 0x40024000, 0x400);
+ create_unimplemented_device(obj, "i2s", 0x40024000, 0x400);
/* In hardware this is a LAN9220; the LAN9118 is software compatible
* except that it doesn't support the checksum-offload feature.
diff --git a/hw/arm/mps3r.c b/hw/arm/mps3r.c
index 8e249c9b9d..4d432de6ba 100644
--- a/hw/arm/mps3r.c
+++ b/hw/arm/mps3r.c
@@ -458,7 +458,7 @@ static void mps3r_common_init(MachineState *machine)
for (int i = 0; i < 4; i++) {
/* CMSDK GPIO controllers */
g_autofree char *s = g_strdup_printf("gpio%d", i);
- create_unimplemented_device(s, 0xe0000000 + i * 0x1000, 0x1000);
+ create_unimplemented_device(OBJECT(machine), s, 0xe0000000 + i * 0x1000, 0x1000);
}
object_initialize_child(OBJECT(mms), "watchdog", &mms->watchdog,
@@ -526,7 +526,7 @@ static void mps3r_common_init(MachineState *machine)
sysbus_realize(SYS_BUS_DEVICE(&mms->scc), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(&mms->scc), 0, 0xe0200000);
- create_unimplemented_device("i2s-audio", 0xe0201000, 0x1000);
+ create_unimplemented_device(OBJECT(machine), "i2s-audio", 0xe0201000, 0x1000);
object_initialize_child(OBJECT(mms), "fpgaio", &mms->fpgaio,
TYPE_MPS2_FPGAIO);
@@ -537,7 +537,7 @@ static void mps3r_common_init(MachineState *machine)
sysbus_realize(SYS_BUS_DEVICE(&mms->fpgaio), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(&mms->fpgaio), 0, 0xe0202000);
- create_unimplemented_device("clcd", 0xe0209000, 0x1000);
+ create_unimplemented_device(OBJECT(machine), "clcd", 0xe0209000, 0x1000);
object_initialize_child(OBJECT(mms), "rtc", &mms->rtc, TYPE_PL031);
sysbus_realize(SYS_BUS_DEVICE(&mms->rtc), &error_fatal);
@@ -552,8 +552,8 @@ static void mps3r_common_init(MachineState *machine)
lan9118_init(OBJECT(machine), 0xe0300000,
qdev_get_gpio_in(gicdev, 18));
- create_unimplemented_device("usb", 0xe0301000, 0x1000);
- create_unimplemented_device("qspi-write-config", 0xe0600000, 0x1000);
+ create_unimplemented_device(OBJECT(machine), "usb", 0xe0301000, 0x1000);
+ create_unimplemented_device(OBJECT(machine), "qspi-write-config", 0xe0600000, 0x1000);
mms->bootinfo.ram_size = machine->ram_size;
mms->bootinfo.board_id = -1;
diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
index 76eba752bd..c03778c439 100644
--- a/hw/arm/msf2-soc.c
+++ b/hw/arm/msf2-soc.c
@@ -210,16 +210,16 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
qdev_get_gpio_in(armv7m, MSF2_EMAC_IRQ));
/* Below devices are not modelled yet. */
- create_unimplemented_device("i2c_0", 0x40002000, 0x1000);
- create_unimplemented_device("dma", 0x40003000, 0x1000);
- create_unimplemented_device("watchdog", 0x40005000, 0x1000);
- create_unimplemented_device("i2c_1", 0x40012000, 0x1000);
- create_unimplemented_device("gpio", 0x40013000, 0x1000);
- create_unimplemented_device("hs-dma", 0x40014000, 0x1000);
- create_unimplemented_device("can", 0x40015000, 0x1000);
- create_unimplemented_device("rtc", 0x40017000, 0x1000);
- create_unimplemented_device("apb_config", 0x40020000, 0x10000);
- create_unimplemented_device("usb", 0x40043000, 0x1000);
+ create_unimplemented_device(OBJECT(dev_soc), "i2c_0", 0x40002000, 0x1000);
+ create_unimplemented_device(OBJECT(dev_soc), "dma", 0x40003000, 0x1000);
+ create_unimplemented_device(OBJECT(dev_soc), "watchdog", 0x40005000, 0x1000);
+ create_unimplemented_device(OBJECT(dev_soc), "i2c_1", 0x40012000, 0x1000);
+ create_unimplemented_device(OBJECT(dev_soc), "gpio", 0x40013000, 0x1000);
+ create_unimplemented_device(OBJECT(dev_soc), "hs-dma", 0x40014000, 0x1000);
+ create_unimplemented_device(OBJECT(dev_soc), "can", 0x40015000, 0x1000);
+ create_unimplemented_device(OBJECT(dev_soc), "rtc", 0x40017000, 0x1000);
+ create_unimplemented_device(OBJECT(dev_soc), "apb_config", 0x40020000, 0x10000);
+ create_unimplemented_device(OBJECT(dev_soc), "usb", 0x40043000, 0x1000);
}
static const Property m2sxxx_soc_properties[] = {
diff --git a/hw/arm/npcm7xx.c b/hw/arm/npcm7xx.c
index a930f7843a..1ee8820070 100644
--- a/hw/arm/npcm7xx.c
+++ b/hw/arm/npcm7xx.c
@@ -479,6 +479,7 @@ static void npcm7xx_init(Object *obj)
static void npcm7xx_realize(DeviceState *dev, Error **errp)
{
+ Object *obj = OBJECT(dev);
NPCM7xxState *s = NPCM7XX(dev);
NPCM7xxClass *nc = NPCM7XX_GET_CLASS(s);
int i;
@@ -600,30 +601,30 @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
/* GPIO modules. Cannot fail. */
QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_gpio) != ARRAY_SIZE(s->gpio));
for (i = 0; i < ARRAY_SIZE(s->gpio); i++) {
- Object *obj = OBJECT(&s->gpio[i]);
+ Object *gobj = OBJECT(&s->gpio[i]);
- object_property_set_uint(obj, "reset-pullup",
+ object_property_set_uint(gobj, "reset-pullup",
npcm7xx_gpio[i].reset_pu, &error_abort);
- object_property_set_uint(obj, "reset-pulldown",
+ object_property_set_uint(gobj, "reset-pulldown",
npcm7xx_gpio[i].reset_pd, &error_abort);
- object_property_set_uint(obj, "reset-osrc",
+ object_property_set_uint(gobj, "reset-osrc",
npcm7xx_gpio[i].reset_osrc, &error_abort);
- object_property_set_uint(obj, "reset-odsc",
+ object_property_set_uint(gobj, "reset-odsc",
npcm7xx_gpio[i].reset_odsc, &error_abort);
- sysbus_realize(SYS_BUS_DEVICE(obj), &error_abort);
- sysbus_mmio_map(SYS_BUS_DEVICE(obj), 0, npcm7xx_gpio[i].regs_addr);
- sysbus_connect_irq(SYS_BUS_DEVICE(obj), 0,
+ sysbus_realize(SYS_BUS_DEVICE(gobj), &error_abort);
+ sysbus_mmio_map(SYS_BUS_DEVICE(gobj), 0, npcm7xx_gpio[i].regs_addr);
+ sysbus_connect_irq(SYS_BUS_DEVICE(gobj), 0,
npcm7xx_irq(s, NPCM7XX_GPIO0_IRQ + i));
}
/* SMBus modules. Cannot fail. */
QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_smbus_addr) != ARRAY_SIZE(s->smbus));
for (i = 0; i < ARRAY_SIZE(s->smbus); i++) {
- Object *obj = OBJECT(&s->smbus[i]);
+ Object *sobj = OBJECT(&s->smbus[i]);
- sysbus_realize(SYS_BUS_DEVICE(obj), &error_abort);
- sysbus_mmio_map(SYS_BUS_DEVICE(obj), 0, npcm7xx_smbus_addr[i]);
- sysbus_connect_irq(SYS_BUS_DEVICE(obj), 0,
+ sysbus_realize(SYS_BUS_DEVICE(sobj), &error_abort);
+ sysbus_mmio_map(SYS_BUS_DEVICE(sobj), 0, npcm7xx_smbus_addr[i]);
+ sysbus_connect_irq(SYS_BUS_DEVICE(sobj), 0,
npcm7xx_irq(s, NPCM7XX_SMBUS0_IRQ + i));
}
@@ -781,39 +782,39 @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
sysbus_connect_irq(sbd, 0, npcm7xx_irq(s, irq));
}
- create_unimplemented_device("npcm7xx.shm", 0xc0001000, 4 * KiB);
- create_unimplemented_device("npcm7xx.vdmx", 0xe0800000, 4 * KiB);
- create_unimplemented_device("npcm7xx.pcierc", 0xe1000000, 64 * KiB);
- create_unimplemented_device("npcm7xx.kcs", 0xf0007000, 4 * KiB);
- create_unimplemented_device("npcm7xx.gfxi", 0xf000e000, 4 * KiB);
- create_unimplemented_device("npcm7xx.espi", 0xf009f000, 4 * KiB);
- create_unimplemented_device("npcm7xx.peci", 0xf0100000, 4 * KiB);
- create_unimplemented_device("npcm7xx.siox[1]", 0xf0101000, 4 * KiB);
- create_unimplemented_device("npcm7xx.siox[2]", 0xf0102000, 4 * KiB);
- create_unimplemented_device("npcm7xx.ahbpci", 0xf0400000, 1 * MiB);
- create_unimplemented_device("npcm7xx.mcphy", 0xf05f0000, 64 * KiB);
- create_unimplemented_device("npcm7xx.vcd", 0xf0810000, 64 * KiB);
- create_unimplemented_device("npcm7xx.ece", 0xf0820000, 8 * KiB);
- create_unimplemented_device("npcm7xx.vdma", 0xf0822000, 8 * KiB);
- create_unimplemented_device("npcm7xx.usbd[0]", 0xf0830000, 4 * KiB);
- create_unimplemented_device("npcm7xx.usbd[1]", 0xf0831000, 4 * KiB);
- create_unimplemented_device("npcm7xx.usbd[2]", 0xf0832000, 4 * KiB);
- create_unimplemented_device("npcm7xx.usbd[3]", 0xf0833000, 4 * KiB);
- create_unimplemented_device("npcm7xx.usbd[4]", 0xf0834000, 4 * KiB);
- create_unimplemented_device("npcm7xx.usbd[5]", 0xf0835000, 4 * KiB);
- create_unimplemented_device("npcm7xx.usbd[6]", 0xf0836000, 4 * KiB);
- create_unimplemented_device("npcm7xx.usbd[7]", 0xf0837000, 4 * KiB);
- create_unimplemented_device("npcm7xx.usbd[8]", 0xf0838000, 4 * KiB);
- create_unimplemented_device("npcm7xx.usbd[9]", 0xf0839000, 4 * KiB);
- create_unimplemented_device("npcm7xx.sd", 0xf0840000, 8 * KiB);
- create_unimplemented_device("npcm7xx.pcimbx", 0xf0848000, 512 * KiB);
- create_unimplemented_device("npcm7xx.aes", 0xf0858000, 4 * KiB);
- create_unimplemented_device("npcm7xx.des", 0xf0859000, 4 * KiB);
- create_unimplemented_device("npcm7xx.sha", 0xf085a000, 4 * KiB);
- create_unimplemented_device("npcm7xx.secacc", 0xf085b000, 4 * KiB);
- create_unimplemented_device("npcm7xx.spixcs0", 0xf8000000, 16 * MiB);
- create_unimplemented_device("npcm7xx.spixcs1", 0xf9000000, 16 * MiB);
- create_unimplemented_device("npcm7xx.spix", 0xfb001000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.shm", 0xc0001000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.vdmx", 0xe0800000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.pcierc", 0xe1000000, 64 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.kcs", 0xf0007000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.gfxi", 0xf000e000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.espi", 0xf009f000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.peci", 0xf0100000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.siox[1]", 0xf0101000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.siox[2]", 0xf0102000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.ahbpci", 0xf0400000, 1 * MiB);
+ create_unimplemented_device(obj, "npcm7xx.mcphy", 0xf05f0000, 64 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.vcd", 0xf0810000, 64 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.ece", 0xf0820000, 8 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.vdma", 0xf0822000, 8 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.usbd[0]", 0xf0830000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.usbd[1]", 0xf0831000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.usbd[2]", 0xf0832000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.usbd[3]", 0xf0833000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.usbd[4]", 0xf0834000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.usbd[5]", 0xf0835000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.usbd[6]", 0xf0836000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.usbd[7]", 0xf0837000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.usbd[8]", 0xf0838000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.usbd[9]", 0xf0839000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.sd", 0xf0840000, 8 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.pcimbx", 0xf0848000, 512 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.aes", 0xf0858000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.des", 0xf0859000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.sha", 0xf085a000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.secacc", 0xf085b000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm7xx.spixcs0", 0xf8000000, 16 * MiB);
+ create_unimplemented_device(obj, "npcm7xx.spixcs1", 0xf9000000, 16 * MiB);
+ create_unimplemented_device(obj, "npcm7xx.spix", 0xfb001000, 4 * KiB);
}
static const Property npcm7xx_properties[] = {
diff --git a/hw/arm/npcm8xx.c b/hw/arm/npcm8xx.c
index 48fcc65a98..c7c371cac6 100644
--- a/hw/arm/npcm8xx.c
+++ b/hw/arm/npcm8xx.c
@@ -471,6 +471,7 @@ static void npcm8xx_init(Object *obj)
static void npcm8xx_realize(DeviceState *dev, Error **errp)
{
+ Object *obj = OBJECT(dev);
NPCM8xxState *s = NPCM8XX(dev);
NPCM8xxClass *nc = NPCM8XX_GET_CLASS(s);
int i;
@@ -614,30 +615,30 @@ static void npcm8xx_realize(DeviceState *dev, Error **errp)
/* GPIO modules. Cannot fail. */
QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm8xx_gpio) != ARRAY_SIZE(s->gpio));
for (i = 0; i < ARRAY_SIZE(s->gpio); i++) {
- Object *obj = OBJECT(&s->gpio[i]);
+ Object *gobj = OBJECT(&s->gpio[i]);
- object_property_set_uint(obj, "reset-pullup",
+ object_property_set_uint(gobj, "reset-pullup",
npcm8xx_gpio[i].reset_pu, &error_abort);
- object_property_set_uint(obj, "reset-pulldown",
+ object_property_set_uint(gobj, "reset-pulldown",
npcm8xx_gpio[i].reset_pd, &error_abort);
- object_property_set_uint(obj, "reset-osrc",
+ object_property_set_uint(gobj, "reset-osrc",
npcm8xx_gpio[i].reset_osrc, &error_abort);
- object_property_set_uint(obj, "reset-odsc",
+ object_property_set_uint(gobj, "reset-odsc",
npcm8xx_gpio[i].reset_odsc, &error_abort);
- sysbus_realize(SYS_BUS_DEVICE(obj), &error_abort);
- sysbus_mmio_map(SYS_BUS_DEVICE(obj), 0, npcm8xx_gpio[i].regs_addr);
- sysbus_connect_irq(SYS_BUS_DEVICE(obj), 0,
+ sysbus_realize(SYS_BUS_DEVICE(gobj), &error_abort);
+ sysbus_mmio_map(SYS_BUS_DEVICE(gobj), 0, npcm8xx_gpio[i].regs_addr);
+ sysbus_connect_irq(SYS_BUS_DEVICE(gobj), 0,
npcm8xx_irq(s, NPCM8XX_GPIO0_IRQ + i));
}
/* SMBus modules. Cannot fail. */
QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm8xx_smbus_addr) != ARRAY_SIZE(s->smbus));
for (i = 0; i < ARRAY_SIZE(s->smbus); i++) {
- Object *obj = OBJECT(&s->smbus[i]);
+ Object *sobj = OBJECT(&s->smbus[i]);
- sysbus_realize(SYS_BUS_DEVICE(obj), &error_abort);
- sysbus_mmio_map(SYS_BUS_DEVICE(obj), 0, npcm8xx_smbus_addr[i]);
- sysbus_connect_irq(SYS_BUS_DEVICE(obj), 0,
+ sysbus_realize(SYS_BUS_DEVICE(sobj), &error_abort);
+ sysbus_mmio_map(SYS_BUS_DEVICE(sobj), 0, npcm8xx_smbus_addr[i]);
+ sysbus_connect_irq(SYS_BUS_DEVICE(sobj), 0,
npcm8xx_irq(s, NPCM8XX_SMBUS0_IRQ + i));
}
@@ -766,66 +767,66 @@ static void npcm8xx_realize(DeviceState *dev, Error **errp)
sysbus_connect_irq(SYS_BUS_DEVICE(&s->pspi), 0,
npcm8xx_irq(s, NPCM8XX_PSPI_IRQ));
- create_unimplemented_device("npcm8xx.shm", 0xc0001000, 4 * KiB);
- create_unimplemented_device("npcm8xx.gicextra", 0xdfffa000, 24 * KiB);
- create_unimplemented_device("npcm8xx.vdmx", 0xe0800000, 4 * KiB);
- create_unimplemented_device("npcm8xx.pcierc", 0xe1000000, 64 * KiB);
- create_unimplemented_device("npcm8xx.rootc", 0xe8000000, 128 * MiB);
- create_unimplemented_device("npcm8xx.kcs", 0xf0007000, 4 * KiB);
- create_unimplemented_device("npcm8xx.gfxi", 0xf000e000, 4 * KiB);
- create_unimplemented_device("npcm8xx.fsw", 0xf000f000, 4 * KiB);
- create_unimplemented_device("npcm8xx.bt", 0xf0030000, 4 * KiB);
- create_unimplemented_device("npcm8xx.espi", 0xf009f000, 4 * KiB);
- create_unimplemented_device("npcm8xx.peci", 0xf0100000, 4 * KiB);
- create_unimplemented_device("npcm8xx.siox[1]", 0xf0101000, 4 * KiB);
- create_unimplemented_device("npcm8xx.siox[2]", 0xf0102000, 4 * KiB);
- create_unimplemented_device("npcm8xx.tmps", 0xf0188000, 4 * KiB);
- create_unimplemented_device("npcm8xx.viru1", 0xf0204000, 4 * KiB);
- create_unimplemented_device("npcm8xx.viru2", 0xf0205000, 4 * KiB);
- create_unimplemented_device("npcm8xx.jtm1", 0xf0208000, 4 * KiB);
- create_unimplemented_device("npcm8xx.jtm2", 0xf0209000, 4 * KiB);
- create_unimplemented_device("npcm8xx.flm0", 0xf0210000, 4 * KiB);
- create_unimplemented_device("npcm8xx.flm1", 0xf0211000, 4 * KiB);
- create_unimplemented_device("npcm8xx.flm2", 0xf0212000, 4 * KiB);
- create_unimplemented_device("npcm8xx.flm3", 0xf0213000, 4 * KiB);
- create_unimplemented_device("npcm8xx.ahbpci", 0xf0400000, 1 * MiB);
- create_unimplemented_device("npcm8xx.dap", 0xf0500000, 960 * KiB);
- create_unimplemented_device("npcm8xx.mcphy", 0xf05f0000, 64 * KiB);
- create_unimplemented_device("npcm8xx.tsgen", 0xf07fc000, 8 * KiB);
- create_unimplemented_device("npcm8xx.copctl", 0xf080c000, 4 * KiB);
- create_unimplemented_device("npcm8xx.tipctl", 0xf080d000, 4 * KiB);
- create_unimplemented_device("npcm8xx.rst", 0xf080e000, 4 * KiB);
- create_unimplemented_device("npcm8xx.vcd", 0xf0810000, 64 * KiB);
- create_unimplemented_device("npcm8xx.ece", 0xf0820000, 8 * KiB);
- create_unimplemented_device("npcm8xx.vdma", 0xf0822000, 8 * KiB);
- create_unimplemented_device("npcm8xx.usbd[0]", 0xf0830000, 4 * KiB);
- create_unimplemented_device("npcm8xx.usbd[1]", 0xf0831000, 4 * KiB);
- create_unimplemented_device("npcm8xx.usbd[2]", 0xf0832000, 4 * KiB);
- create_unimplemented_device("npcm8xx.usbd[3]", 0xf0833000, 4 * KiB);
- create_unimplemented_device("npcm8xx.usbd[4]", 0xf0834000, 4 * KiB);
- create_unimplemented_device("npcm8xx.usbd[5]", 0xf0835000, 4 * KiB);
- create_unimplemented_device("npcm8xx.usbd[6]", 0xf0836000, 4 * KiB);
- create_unimplemented_device("npcm8xx.usbd[7]", 0xf0837000, 4 * KiB);
- create_unimplemented_device("npcm8xx.usbd[8]", 0xf0838000, 4 * KiB);
- create_unimplemented_device("npcm8xx.usbd[9]", 0xf0839000, 4 * KiB);
- create_unimplemented_device("npcm8xx.pci_mbox1", 0xf0848000, 64 * KiB);
- create_unimplemented_device("npcm8xx.gdma0", 0xf0850000, 4 * KiB);
- create_unimplemented_device("npcm8xx.gdma1", 0xf0851000, 4 * KiB);
- create_unimplemented_device("npcm8xx.gdma2", 0xf0852000, 4 * KiB);
- create_unimplemented_device("npcm8xx.aes", 0xf0858000, 4 * KiB);
- create_unimplemented_device("npcm8xx.des", 0xf0859000, 4 * KiB);
- create_unimplemented_device("npcm8xx.sha", 0xf085a000, 4 * KiB);
- create_unimplemented_device("npcm8xx.pci_mbox2", 0xf0868000, 64 * KiB);
- create_unimplemented_device("npcm8xx.i3c0", 0xfff10000, 4 * KiB);
- create_unimplemented_device("npcm8xx.i3c1", 0xfff11000, 4 * KiB);
- create_unimplemented_device("npcm8xx.i3c2", 0xfff12000, 4 * KiB);
- create_unimplemented_device("npcm8xx.i3c3", 0xfff13000, 4 * KiB);
- create_unimplemented_device("npcm8xx.i3c4", 0xfff14000, 4 * KiB);
- create_unimplemented_device("npcm8xx.i3c5", 0xfff15000, 4 * KiB);
- create_unimplemented_device("npcm8xx.spixcs0", 0xf8000000, 16 * MiB);
- create_unimplemented_device("npcm8xx.spixcs1", 0xf9000000, 16 * MiB);
- create_unimplemented_device("npcm8xx.spix", 0xfb001000, 4 * KiB);
- create_unimplemented_device("npcm8xx.vect", 0xffff0000, 256);
+ create_unimplemented_device(obj, "npcm8xx.shm", 0xc0001000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.gicextra", 0xdfffa000, 24 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.vdmx", 0xe0800000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.pcierc", 0xe1000000, 64 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.rootc", 0xe8000000, 128 * MiB);
+ create_unimplemented_device(obj, "npcm8xx.kcs", 0xf0007000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.gfxi", 0xf000e000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.fsw", 0xf000f000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.bt", 0xf0030000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.espi", 0xf009f000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.peci", 0xf0100000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.siox[1]", 0xf0101000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.siox[2]", 0xf0102000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.tmps", 0xf0188000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.viru1", 0xf0204000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.viru2", 0xf0205000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.jtm1", 0xf0208000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.jtm2", 0xf0209000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.flm0", 0xf0210000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.flm1", 0xf0211000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.flm2", 0xf0212000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.flm3", 0xf0213000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.ahbpci", 0xf0400000, 1 * MiB);
+ create_unimplemented_device(obj, "npcm8xx.dap", 0xf0500000, 960 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.mcphy", 0xf05f0000, 64 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.tsgen", 0xf07fc000, 8 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.copctl", 0xf080c000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.tipctl", 0xf080d000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.rst", 0xf080e000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.vcd", 0xf0810000, 64 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.ece", 0xf0820000, 8 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.vdma", 0xf0822000, 8 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.usbd[0]", 0xf0830000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.usbd[1]", 0xf0831000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.usbd[2]", 0xf0832000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.usbd[3]", 0xf0833000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.usbd[4]", 0xf0834000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.usbd[5]", 0xf0835000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.usbd[6]", 0xf0836000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.usbd[7]", 0xf0837000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.usbd[8]", 0xf0838000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.usbd[9]", 0xf0839000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.pci_mbox1", 0xf0848000, 64 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.gdma0", 0xf0850000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.gdma1", 0xf0851000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.gdma2", 0xf0852000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.aes", 0xf0858000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.des", 0xf0859000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.sha", 0xf085a000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.pci_mbox2", 0xf0868000, 64 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.i3c0", 0xfff10000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.i3c1", 0xfff11000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.i3c2", 0xfff12000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.i3c3", 0xfff13000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.i3c4", 0xfff14000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.i3c5", 0xfff15000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.spixcs0", 0xf8000000, 16 * MiB);
+ create_unimplemented_device(obj, "npcm8xx.spixcs1", 0xf9000000, 16 * MiB);
+ create_unimplemented_device(obj, "npcm8xx.spix", 0xfb001000, 4 * KiB);
+ create_unimplemented_device(obj, "npcm8xx.vect", 0xffff0000, 256);
}
static const Property npcm8xx_properties[] = {
diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
index 8d8ea71da4..f75b742242 100644
--- a/hw/arm/nrf51_soc.c
+++ b/hw/arm/nrf51_soc.c
@@ -171,9 +171,9 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
memory_region_add_subregion_overlap(&s->container,
NRF51_IOMEM_BASE, &s->clock, -1);
- create_unimplemented_device("nrf51_soc.io", NRF51_IOMEM_BASE,
+ create_unimplemented_device(OBJECT(dev_soc), "nrf51_soc.io", NRF51_IOMEM_BASE,
NRF51_IOMEM_SIZE);
- create_unimplemented_device("nrf51_soc.private",
+ create_unimplemented_device(OBJECT(dev_soc), "nrf51_soc.private",
NRF51_PRIVATE_BASE, NRF51_PRIVATE_SIZE);
}
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index b2ff6f4d97..6a732a3c11 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1381,12 +1381,12 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
/* Add dummy regions for the devices we don't implement yet,
* so guest accesses don't cause unlogged crashes.
*/
- create_unimplemented_device("PWM", 0x40028000, 0x1000);
- create_unimplemented_device("QEI-0", 0x4002c000, 0x1000);
- create_unimplemented_device("QEI-1", 0x4002d000, 0x1000);
- create_unimplemented_device("analogue-comparator", 0x4003c000, 0x1000);
- create_unimplemented_device("hibernation", 0x400fc000, 0x1000);
- create_unimplemented_device("flash-control", 0x400fd000, 0x1000);
+ create_unimplemented_device(OBJECT(ms), "PWM", 0x40028000, 0x1000);
+ create_unimplemented_device(OBJECT(ms), "QEI-0", 0x4002c000, 0x1000);
+ create_unimplemented_device(OBJECT(ms), "QEI-1", 0x4002d000, 0x1000);
+ create_unimplemented_device(OBJECT(ms), "analogue-comparator", 0x4003c000, 0x1000);
+ create_unimplemented_device(OBJECT(ms), "hibernation", 0x400fc000, 0x1000);
+ create_unimplemented_device(OBJECT(ms), "flash-control", 0x400fd000, 0x1000);
armv7m_load_kernel(ARMV7M(armv7m)->cpu, ms->kernel_filename, 0, flash_size);
}
diff --git a/hw/arm/stm32f100_soc.c b/hw/arm/stm32f100_soc.c
index 2358368dba..e9e722f359 100644
--- a/hw/arm/stm32f100_soc.c
+++ b/hw/arm/stm32f100_soc.c
@@ -149,36 +149,36 @@ static void stm32f100_soc_realize(DeviceState *dev_soc, Error **errp)
sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, spi_irq[i]));
}
- create_unimplemented_device("timer[2]", 0x40000000, 0x400);
- create_unimplemented_device("timer[3]", 0x40000400, 0x400);
- create_unimplemented_device("timer[4]", 0x40000800, 0x400);
- create_unimplemented_device("timer[6]", 0x40001000, 0x400);
- create_unimplemented_device("timer[7]", 0x40001400, 0x400);
- create_unimplemented_device("RTC", 0x40002800, 0x400);
- create_unimplemented_device("WWDG", 0x40002C00, 0x400);
- create_unimplemented_device("IWDG", 0x40003000, 0x400);
- create_unimplemented_device("I2C1", 0x40005400, 0x400);
- create_unimplemented_device("I2C2", 0x40005800, 0x400);
- create_unimplemented_device("BKP", 0x40006C00, 0x400);
- create_unimplemented_device("PWR", 0x40007000, 0x400);
- create_unimplemented_device("DAC", 0x40007400, 0x400);
- create_unimplemented_device("CEC", 0x40007800, 0x400);
- create_unimplemented_device("AFIO", 0x40010000, 0x400);
- create_unimplemented_device("EXTI", 0x40010400, 0x400);
- create_unimplemented_device("GPIOA", 0x40010800, 0x400);
- create_unimplemented_device("GPIOB", 0x40010C00, 0x400);
- create_unimplemented_device("GPIOC", 0x40011000, 0x400);
- create_unimplemented_device("GPIOD", 0x40011400, 0x400);
- create_unimplemented_device("GPIOE", 0x40011800, 0x400);
- create_unimplemented_device("ADC1", 0x40012400, 0x400);
- create_unimplemented_device("timer[1]", 0x40012C00, 0x400);
- create_unimplemented_device("timer[15]", 0x40014000, 0x400);
- create_unimplemented_device("timer[16]", 0x40014400, 0x400);
- create_unimplemented_device("timer[17]", 0x40014800, 0x400);
- create_unimplemented_device("DMA", 0x40020000, 0x400);
- create_unimplemented_device("RCC", 0x40021000, 0x400);
- create_unimplemented_device("Flash Int", 0x40022000, 0x400);
- create_unimplemented_device("CRC", 0x40023000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer[2]", 0x40000000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer[3]", 0x40000400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer[4]", 0x40000800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer[6]", 0x40001000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer[7]", 0x40001400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "RTC", 0x40002800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "WWDG", 0x40002C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "IWDG", 0x40003000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "I2C1", 0x40005400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "I2C2", 0x40005800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "BKP", 0x40006C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "PWR", 0x40007000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "DAC", 0x40007400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "CEC", 0x40007800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "AFIO", 0x40010000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "EXTI", 0x40010400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOA", 0x40010800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOB", 0x40010C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOC", 0x40011000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOD", 0x40011400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOE", 0x40011800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "ADC1", 0x40012400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer[1]", 0x40012C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer[15]", 0x40014000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer[16]", 0x40014400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer[17]", 0x40014800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "DMA", 0x40020000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "RCC", 0x40021000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "Flash Int", 0x40022000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "CRC", 0x40023000, 0x400);
}
static void stm32f100_soc_class_init(ObjectClass *klass, const void *data)
diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
index c2bc460603..dc9b3053a5 100644
--- a/hw/arm/stm32f405_soc.c
+++ b/hw/arm/stm32f405_soc.c
@@ -254,48 +254,48 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
qdev_connect_gpio_out(DEVICE(&s->syscfg), i, qdev_get_gpio_in(dev, i));
}
- create_unimplemented_device("timer[7]", 0x40001400, 0x400);
- create_unimplemented_device("timer[12]", 0x40001800, 0x400);
- create_unimplemented_device("timer[6]", 0x40001000, 0x400);
- create_unimplemented_device("timer[13]", 0x40001C00, 0x400);
- create_unimplemented_device("timer[14]", 0x40002000, 0x400);
- create_unimplemented_device("RTC and BKP", 0x40002800, 0x400);
- create_unimplemented_device("WWDG", 0x40002C00, 0x400);
- create_unimplemented_device("IWDG", 0x40003000, 0x400);
- create_unimplemented_device("I2S2ext", 0x40003000, 0x400);
- create_unimplemented_device("I2S3ext", 0x40004000, 0x400);
- create_unimplemented_device("I2C1", 0x40005400, 0x400);
- create_unimplemented_device("I2C2", 0x40005800, 0x400);
- create_unimplemented_device("I2C3", 0x40005C00, 0x400);
- create_unimplemented_device("CAN1", 0x40006400, 0x400);
- create_unimplemented_device("CAN2", 0x40006800, 0x400);
- create_unimplemented_device("PWR", 0x40007000, 0x400);
- create_unimplemented_device("DAC", 0x40007400, 0x400);
- create_unimplemented_device("timer[1]", 0x40010000, 0x400);
- create_unimplemented_device("timer[8]", 0x40010400, 0x400);
- create_unimplemented_device("SDIO", 0x40012C00, 0x400);
- create_unimplemented_device("timer[9]", 0x40014000, 0x400);
- create_unimplemented_device("timer[10]", 0x40014400, 0x400);
- create_unimplemented_device("timer[11]", 0x40014800, 0x400);
- create_unimplemented_device("GPIOA", 0x40020000, 0x400);
- create_unimplemented_device("GPIOB", 0x40020400, 0x400);
- create_unimplemented_device("GPIOC", 0x40020800, 0x400);
- create_unimplemented_device("GPIOD", 0x40020C00, 0x400);
- create_unimplemented_device("GPIOE", 0x40021000, 0x400);
- create_unimplemented_device("GPIOF", 0x40021400, 0x400);
- create_unimplemented_device("GPIOG", 0x40021800, 0x400);
- create_unimplemented_device("GPIOH", 0x40021C00, 0x400);
- create_unimplemented_device("GPIOI", 0x40022000, 0x400);
- create_unimplemented_device("CRC", 0x40023000, 0x400);
- create_unimplemented_device("Flash Int", 0x40023C00, 0x400);
- create_unimplemented_device("BKPSRAM", 0x40024000, 0x400);
- create_unimplemented_device("DMA1", 0x40026000, 0x400);
- create_unimplemented_device("DMA2", 0x40026400, 0x400);
- create_unimplemented_device("Ethernet", 0x40028000, 0x1400);
- create_unimplemented_device("USB OTG HS", 0x40040000, 0x30000);
- create_unimplemented_device("USB OTG FS", 0x50000000, 0x31000);
- create_unimplemented_device("DCMI", 0x50050000, 0x400);
- create_unimplemented_device("RNG", 0x50060800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer-unimp[7]", 0x40001400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer-unimp[12]", 0x40001800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer-unimp[6]", 0x40001000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer-unimp[13]", 0x40001C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer-unimp[14]", 0x40002000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "RTC and BKP", 0x40002800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "WWDG", 0x40002C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "IWDG", 0x40003000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "I2S2ext", 0x40003000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "I2S3ext", 0x40004000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "I2C1", 0x40005400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "I2C2", 0x40005800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "I2C3", 0x40005C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "CAN1", 0x40006400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "CAN2", 0x40006800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "PWR", 0x40007000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "DAC", 0x40007400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer-unimp[1]", 0x40010000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer-unimp[8]", 0x40010400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "SDIO", 0x40012C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer-unimp[9]", 0x40014000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer-unimp[10]", 0x40014400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "timer-unimp[11]", 0x40014800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOA", 0x40020000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOB", 0x40020400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOC", 0x40020800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOD", 0x40020C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOE", 0x40021000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOF", 0x40021400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOG", 0x40021800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOH", 0x40021C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "GPIOI", 0x40022000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "CRC", 0x40023000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "Flash Int", 0x40023C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "BKPSRAM", 0x40024000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "DMA1", 0x40026000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "DMA2", 0x40026400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "Ethernet", 0x40028000, 0x1400);
+ create_unimplemented_device(OBJECT(dev_soc), "USB OTG HS", 0x40040000, 0x30000);
+ create_unimplemented_device(OBJECT(dev_soc), "USB OTG FS", 0x50000000, 0x31000);
+ create_unimplemented_device(OBJECT(dev_soc), "DCMI", 0x50050000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "RNG", 0x50060800, 0x400);
}
static void stm32f405_soc_class_init(ObjectClass *klass, const void *data)
diff --git a/hw/arm/stm32l4x5_soc.c b/hw/arm/stm32l4x5_soc.c
index 39b8cdf97d..d94ef49217 100644
--- a/hw/arm/stm32l4x5_soc.c
+++ b/hw/arm/stm32l4x5_soc.c
@@ -359,80 +359,80 @@ static void stm32l4x5_soc_realize(DeviceState *dev_soc, Error **errp)
EXTI_LPUART1_IRQ));
/* APB1 BUS */
- create_unimplemented_device("TIM2", 0x40000000, 0x400);
- create_unimplemented_device("TIM3", 0x40000400, 0x400);
- create_unimplemented_device("TIM4", 0x40000800, 0x400);
- create_unimplemented_device("TIM5", 0x40000C00, 0x400);
- create_unimplemented_device("TIM6", 0x40001000, 0x400);
- create_unimplemented_device("TIM7", 0x40001400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "TIM2", 0x40000000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "TIM3", 0x40000400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "TIM4", 0x40000800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "TIM5", 0x40000C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "TIM6", 0x40001000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "TIM7", 0x40001400, 0x400);
/* RESERVED: 0x40001800, 0x1000 */
- create_unimplemented_device("RTC", 0x40002800, 0x400);
- create_unimplemented_device("WWDG", 0x40002C00, 0x400);
- create_unimplemented_device("IWDG", 0x40003000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "RTC", 0x40002800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "WWDG", 0x40002C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "IWDG", 0x40003000, 0x400);
/* RESERVED: 0x40001800, 0x400 */
- create_unimplemented_device("SPI2", 0x40003800, 0x400);
- create_unimplemented_device("SPI3", 0x40003C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "SPI2", 0x40003800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "SPI3", 0x40003C00, 0x400);
/* RESERVED: 0x40004000, 0x400 */
- create_unimplemented_device("I2C1", 0x40005400, 0x400);
- create_unimplemented_device("I2C2", 0x40005800, 0x400);
- create_unimplemented_device("I2C3", 0x40005C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "I2C1", 0x40005400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "I2C2", 0x40005800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "I2C3", 0x40005C00, 0x400);
/* RESERVED: 0x40006000, 0x400 */
- create_unimplemented_device("CAN1", 0x40006400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "CAN1", 0x40006400, 0x400);
/* RESERVED: 0x40006800, 0x400 */
- create_unimplemented_device("PWR", 0x40007000, 0x400);
- create_unimplemented_device("DAC1", 0x40007400, 0x400);
- create_unimplemented_device("OPAMP", 0x40007800, 0x400);
- create_unimplemented_device("LPTIM1", 0x40007C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "PWR", 0x40007000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "DAC1", 0x40007400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "OPAMP", 0x40007800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "LPTIM1", 0x40007C00, 0x400);
/* RESERVED: 0x40008400, 0x400 */
- create_unimplemented_device("SWPMI1", 0x40008800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "SWPMI1", 0x40008800, 0x400);
/* RESERVED: 0x40008C00, 0x800 */
- create_unimplemented_device("LPTIM2", 0x40009400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "LPTIM2", 0x40009400, 0x400);
/* RESERVED: 0x40009800, 0x6800 */
/* APB2 BUS */
- create_unimplemented_device("VREFBUF", 0x40010030, 0x1D0);
- create_unimplemented_device("COMP", 0x40010200, 0x200);
+ create_unimplemented_device(OBJECT(dev_soc), "VREFBUF", 0x40010030, 0x1D0);
+ create_unimplemented_device(OBJECT(dev_soc), "COMP", 0x40010200, 0x200);
/* RESERVED: 0x40010800, 0x1400 */
- create_unimplemented_device("FIREWALL", 0x40011C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "FIREWALL", 0x40011C00, 0x400);
/* RESERVED: 0x40012000, 0x800 */
- create_unimplemented_device("SDMMC1", 0x40012800, 0x400);
- create_unimplemented_device("TIM1", 0x40012C00, 0x400);
- create_unimplemented_device("SPI1", 0x40013000, 0x400);
- create_unimplemented_device("TIM8", 0x40013400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "SDMMC1", 0x40012800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "TIM1", 0x40012C00, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "SPI1", 0x40013000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "TIM8", 0x40013400, 0x400);
/* RESERVED: 0x40013C00, 0x400 */
- create_unimplemented_device("TIM15", 0x40014000, 0x400);
- create_unimplemented_device("TIM16", 0x40014400, 0x400);
- create_unimplemented_device("TIM17", 0x40014800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "TIM15", 0x40014000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "TIM16", 0x40014400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "TIM17", 0x40014800, 0x400);
/* RESERVED: 0x40014C00, 0x800 */
- create_unimplemented_device("SAI1", 0x40015400, 0x400);
- create_unimplemented_device("SAI2", 0x40015800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "SAI1", 0x40015400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "SAI2", 0x40015800, 0x400);
/* RESERVED: 0x40015C00, 0x400 */
- create_unimplemented_device("DFSDM1", 0x40016000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "DFSDM1", 0x40016000, 0x400);
/* RESERVED: 0x40016400, 0x9C00 */
/* AHB1 BUS */
- create_unimplemented_device("DMA1", 0x40020000, 0x400);
- create_unimplemented_device("DMA2", 0x40020400, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "DMA1", 0x40020000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "DMA2", 0x40020400, 0x400);
/* RESERVED: 0x40020800, 0x800 */
/* RESERVED: 0x40021400, 0xC00 */
- create_unimplemented_device("FLASH", 0x40022000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "FLASH", 0x40022000, 0x400);
/* RESERVED: 0x40022400, 0xC00 */
- create_unimplemented_device("CRC", 0x40023000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "CRC", 0x40023000, 0x400);
/* RESERVED: 0x40023400, 0x400 */
- create_unimplemented_device("TSC", 0x40024000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "TSC", 0x40024000, 0x400);
/* RESERVED: 0x40024400, 0x7FDBC00 */
/* AHB2 BUS */
/* RESERVED: 0x48002000, 0x7FDBC00 */
- create_unimplemented_device("OTG_FS", 0x50000000, 0x40000);
- create_unimplemented_device("ADC", 0x50040000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "OTG_FS", 0x50000000, 0x40000);
+ create_unimplemented_device(OBJECT(dev_soc), "ADC", 0x50040000, 0x400);
/* RESERVED: 0x50040400, 0x20400 */
- create_unimplemented_device("RNG", 0x50060800, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "RNG", 0x50060800, 0x400);
/* AHB3 BUS */
- create_unimplemented_device("FMC", 0xA0000000, 0x1000);
- create_unimplemented_device("QUADSPI", 0xA0001000, 0x400);
+ create_unimplemented_device(OBJECT(dev_soc), "FMC", 0xA0000000, 0x1000);
+ create_unimplemented_device(OBJECT(dev_soc), "QUADSPI", 0xA0001000, 0x400);
}
static void stm32l4x5_soc_class_init(ObjectClass *klass, const void *data)
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 378ab532a3..30f0ce5b5f 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -205,6 +205,7 @@ static void ddr_ctrl_init(Object *parent, uint32_t base)
static void zynq_init(MachineState *machine)
{
+ Object *obj = OBJECT(machine);
ZynqMachineState *zynq_machine = ZYNQ_MACHINE(machine);
MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *ocm_ram = g_new(MemoryRegion, 1);
@@ -390,67 +391,67 @@ static void zynq_init(MachineState *machine)
* Refer to the ug585-Zynq-7000-TRM manual B.3 (Module Summary) and
* the zynq-7000.dtsi. Add placeholders for unimplemented devices.
*/
- create_unimplemented_device("zynq.i2c0", 0xE0004000, 4 * KiB);
- create_unimplemented_device("zynq.i2c1", 0xE0005000, 4 * KiB);
- create_unimplemented_device("zynq.can0", 0xE0008000, 4 * KiB);
- create_unimplemented_device("zynq.can1", 0xE0009000, 4 * KiB);
- create_unimplemented_device("zynq.gpio", 0xE000A000, 4 * KiB);
- create_unimplemented_device("zynq.smcc", 0xE000E000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.i2c0", 0xE0004000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.i2c1", 0xE0005000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.can0", 0xE0008000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.can1", 0xE0009000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.gpio", 0xE000A000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.smcc", 0xE000E000, 4 * KiB);
/* Direct Memory Access Controller, PL330, Non-Secure Mode */
- create_unimplemented_device("zynq.dma_ns", 0xF8004000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.dma_ns", 0xF8004000, 4 * KiB);
/* System Watchdog Timer Registers */
- create_unimplemented_device("zynq.swdt", 0xF8005000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.swdt", 0xF8005000, 4 * KiB);
/* AXI_HP Interface (AFI) */
- create_unimplemented_device("zynq.axi_hp0", 0xF8008000, 0x28);
- create_unimplemented_device("zynq.axi_hp1", 0xF8009000, 0x28);
- create_unimplemented_device("zynq.axi_hp2", 0xF800A000, 0x28);
- create_unimplemented_device("zynq.axi_hp3", 0xF800B000, 0x28);
+ create_unimplemented_device(obj, "zynq.axi_hp0", 0xF8008000, 0x28);
+ create_unimplemented_device(obj, "zynq.axi_hp1", 0xF8009000, 0x28);
+ create_unimplemented_device(obj, "zynq.axi_hp2", 0xF800A000, 0x28);
+ create_unimplemented_device(obj, "zynq.axi_hp3", 0xF800B000, 0x28);
- create_unimplemented_device("zynq.efuse", 0xF800d000, 0x20);
+ create_unimplemented_device(obj, "zynq.efuse", 0xF800d000, 0x20);
/* Embedded Trace Buffer */
- create_unimplemented_device("zynq.etb", 0xF8801000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.etb", 0xF8801000, 4 * KiB);
/* Cross Trigger Interface, ETB and TPIU */
- create_unimplemented_device("zynq.cti_etb_tpiu", 0xF8802000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.cti_etb_tpiu", 0xF8802000, 4 * KiB);
/* Trace Port Interface Unit */
- create_unimplemented_device("zynq.tpiu", 0xF8803000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.tpiu", 0xF8803000, 4 * KiB);
/* CoreSight Trace Funnel */
- create_unimplemented_device("zynq.funnel", 0xF8804000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.funnel", 0xF8804000, 4 * KiB);
/* Instrumentation Trace Macrocell */
- create_unimplemented_device("zynq.itm", 0xF8805000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.itm", 0xF8805000, 4 * KiB);
/* Cross Trigger Interface, FTM */
- create_unimplemented_device("zynq.cti_ftm", 0xF8809000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.cti_ftm", 0xF8809000, 4 * KiB);
/* Fabric Trace Macrocell */
- create_unimplemented_device("zynq.ftm", 0xF880B000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.ftm", 0xF880B000, 4 * KiB);
/* Cortex A9 Performance Monitoring Unit, CPU */
- create_unimplemented_device("cortex-a9.pmu0", 0xF8891000, 4 * KiB);
- create_unimplemented_device("cortex-a9.pmu1", 0xF8893000, 4 * KiB);
+ create_unimplemented_device(obj, "cortex-a9.pmu0", 0xF8891000, 4 * KiB);
+ create_unimplemented_device(obj, "cortex-a9.pmu1", 0xF8893000, 4 * KiB);
/* Cross Trigger Interface, CPU */
- create_unimplemented_device("zynq.cpu_cti0", 0xF8898000, 4 * KiB);
- create_unimplemented_device("zynq.cpu_cti1", 0xF8899000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.cpu_cti0", 0xF8898000, 4 * KiB);
+ create_unimplemented_device(obj, "zynq.cpu_cti1", 0xF8899000, 4 * KiB);
/* CoreSight PTM-A9, CPU */
- create_unimplemented_device("cortex-a9.ptm0", 0xF889c000, 4 * KiB);
- create_unimplemented_device("cortex-a9.ptm1", 0xF889d000, 4 * KiB);
+ create_unimplemented_device(obj, "cortex-a9.ptm0", 0xF889c000, 4 * KiB);
+ create_unimplemented_device(obj, "cortex-a9.ptm1", 0xF889d000, 4 * KiB);
/* AMBA NIC301 TrustZone */
- create_unimplemented_device("zynq.trustZone", 0xF8900000, 0x20);
+ create_unimplemented_device(obj, "zynq.trustZone", 0xF8900000, 0x20);
/* AMBA Network Interconnect Advanced Quality of Service (QoS-301) */
- create_unimplemented_device("zynq.qos301_cpu", 0xF8946000, 0x130);
- create_unimplemented_device("zynq.qos301_dmac", 0xF8947000, 0x130);
- create_unimplemented_device("zynq.qos301_iou", 0xF8948000, 0x130);
+ create_unimplemented_device(obj, "zynq.qos301_cpu", 0xF8946000, 0x130);
+ create_unimplemented_device(obj, "zynq.qos301_dmac", 0xF8947000, 0x130);
+ create_unimplemented_device(obj, "zynq.qos301_iou", 0xF8948000, 0x130);
zynq_binfo.ram_size = machine->ram_size;
zynq_binfo.board_id = 0xd32;
diff --git a/hw/avr/atmega.c b/hw/avr/atmega.c
index 5eb640f628..b124db001f 100644
--- a/hw/avr/atmega.c
+++ b/hw/avr/atmega.c
@@ -312,7 +312,7 @@ static void atmega_realize(DeviceState *dev, Error **errp)
continue;
}
devname = g_strdup_printf("atmega-gpio-%c", 'a' + (char)i);
- create_unimplemented_device(devname,
+ create_unimplemented_device(OBJECT(dev), devname,
OFFSET_DATA + mc->dev[idx].addr, 3);
g_free(devname);
}
@@ -344,12 +344,12 @@ static void atmega_realize(DeviceState *dev, Error **errp)
continue;
}
if (!mc->dev[idx].is_timer16) {
- create_unimplemented_device("avr-timer8",
+ create_unimplemented_device(OBJECT(dev), "avr-timer8",
OFFSET_DATA + mc->dev[idx].addr, 5);
- create_unimplemented_device("avr-timer8-intmask",
+ create_unimplemented_device(OBJECT(dev), "avr-timer8-intmask",
OFFSET_DATA
+ mc->dev[idx].intmask_addr, 1);
- create_unimplemented_device("avr-timer8-intflag",
+ create_unimplemented_device(OBJECT(dev), "avr-timer8-intflag",
OFFSET_DATA
+ mc->dev[idx].intflag_addr, 1);
continue;
@@ -373,12 +373,12 @@ static void atmega_realize(DeviceState *dev, Error **errp)
g_free(devname);
}
- create_unimplemented_device("avr-twi", OFFSET_DATA + 0x0b8, 6);
- create_unimplemented_device("avr-adc", OFFSET_DATA + 0x078, 8);
- create_unimplemented_device("avr-ext-mem-ctrl", OFFSET_DATA + 0x074, 2);
- create_unimplemented_device("avr-watchdog", OFFSET_DATA + 0x060, 1);
- create_unimplemented_device("avr-spi", OFFSET_DATA + 0x04c, 3);
- create_unimplemented_device("avr-eeprom", OFFSET_DATA + 0x03f, 3);
+ create_unimplemented_device(OBJECT(dev), "avr-twi", OFFSET_DATA + 0x0b8, 6);
+ create_unimplemented_device(OBJECT(dev), "avr-adc", OFFSET_DATA + 0x078, 8);
+ create_unimplemented_device(OBJECT(dev), "avr-ext-mem-ctrl", OFFSET_DATA + 0x074, 2);
+ create_unimplemented_device(OBJECT(dev), "avr-watchdog", OFFSET_DATA + 0x060, 1);
+ create_unimplemented_device(OBJECT(dev), "avr-spi", OFFSET_DATA + 0x04c, 3);
+ create_unimplemented_device(OBJECT(dev), "avr-eeprom", OFFSET_DATA + 0x03f, 3);
}
static const Property atmega_props[] = {
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 7d1d4c7657..8c6d2ad122 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -483,7 +483,7 @@ static void virt_devices_init(DeviceState *pch_pic,
* There are some invalid guest memory access.
* Create some unimplemented devices to emulate this.
*/
- create_unimplemented_device("pci-dma-cfg", 0x1001041c, 0x4);
+ create_unimplemented_device(OBJECT(lvms), "pci-dma-cfg", 0x1001041c, 0x4);
sysbus_create_simple(OBJECT(lvms), "rtc", "ls7a_rtc", VIRT_RTC_REG_BASE,
qdev_get_gpio_in(pch_pic,
VIRT_RTC_IRQ - VIRT_GSI_BASE));
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index 0979d3632b..6986eb7732 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -144,7 +144,7 @@ petalogix_s3adsp1800_init(MachineState *machine)
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, ETHLITE_BASEADDR);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[ETHLITE_IRQ]);
- create_unimplemented_device("xps_gpio", GPIO_BASEADDR, 0x10000);
+ create_unimplemented_device(OBJECT(machine), "xps_gpio", GPIO_BASEADDR, 0x10000);
microblaze_load_kernel(cpu, endianness == ENDIAN_MODE_LITTLE, ddr_base,
ram_size, machine->initrd_filename,
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index 99d2016ef1..8d8430562c 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -478,6 +478,7 @@ static inline void loongson3_virt_devices_init(MachineState *machine,
static void mips_loongson3_virt_init(MachineState *machine)
{
+ Object *obj = OBJECT(machine);
int i;
long bios_size;
MIPSCPU *cpu = NULL;
@@ -515,8 +516,8 @@ static void mips_loongson3_virt_init(MachineState *machine)
* exception when accessing invalid memory. Create some unimplememted
* devices to emulate this feature.
*/
- create_unimplemented_device("mmio fallback 0", 0x10000000, 256 * MiB);
- create_unimplemented_device("mmio fallback 1", 0x30000000, 256 * MiB);
+ create_unimplemented_device(obj, "mmio fallback 0", 0x10000000, 256 * MiB);
+ create_unimplemented_device(obj, "mmio fallback 1", 0x30000000, 256 * MiB);
memory_region_init(iocsr, OBJECT(machine), "loongson3.iocsr", UINT32_MAX);
diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c
index 83b328840a..7b4259c0e7 100644
--- a/hw/pci-host/bonito.c
+++ b/hw/pci-host/bonito.c
@@ -647,7 +647,7 @@ static void bonito_host_realize(DeviceState *dev, Error **errp)
g_free(name);
}
- create_unimplemented_device("pci.io", BONITO_PCIIO_BASE, 1 * MiB);
+ create_unimplemented_device(OBJECT(dev), "pci.io", BONITO_PCIIO_BASE, 1 * MiB);
}
static void bonito_pci_realize(PCIDevice *dev, Error **errp)
@@ -681,7 +681,7 @@ static void bonito_pci_realize(PCIDevice *dev, Error **errp)
memory_region_add_subregion(host_mem, BONITO_SPCICONFIG_BASE,
&phb->data_mem);
- create_unimplemented_device("bonito", BONITO_REG_BASE, BONITO_REG_SIZE);
+ create_unimplemented_device(OBJECT(dev), "bonito", BONITO_REG_BASE, BONITO_REG_SIZE);
memory_region_init_io(&s->iomem_ldma, OBJECT(s), &bonito_ldma_ops, s,
"ldma", 0x100);
@@ -692,7 +692,7 @@ static void bonito_pci_realize(PCIDevice *dev, Error **errp)
"cop", 0x100);
memory_region_add_subregion(host_mem, 0x1fe00300, &s->iomem_cop);
- create_unimplemented_device("ROMCS", BONITO_FLASH_BASE, 60 * MiB);
+ create_unimplemented_device(OBJECT(dev), "ROMCS", BONITO_FLASH_BASE, 60 * MiB);
/* Map PCI IO Space 0x1fd0 0000 - 0x1fd1 0000 */
memory_region_init_alias(&s->bonito_pciio, OBJECT(s), "isa_mmio",
@@ -706,17 +706,17 @@ static void bonito_pci_realize(PCIDevice *dev, Error **errp)
get_system_io(), 0, 256 * KiB);
memory_region_add_subregion(host_mem, BONITO_DEV_BASE,
&s->bonito_localio);
- create_unimplemented_device("IOCS[1]", BONITO_DEV_BASE + 1 * 256 * KiB,
+ create_unimplemented_device(OBJECT(dev), "IOCS[1]", BONITO_DEV_BASE + 1 * 256 * KiB,
256 * KiB);
- create_unimplemented_device("IOCS[2]", BONITO_DEV_BASE + 2 * 256 * KiB,
+ create_unimplemented_device(OBJECT(dev), "IOCS[2]", BONITO_DEV_BASE + 2 * 256 * KiB,
256 * KiB);
- create_unimplemented_device("IOCS[3]", BONITO_DEV_BASE + 3 * 256 * KiB,
+ create_unimplemented_device(OBJECT(dev), "IOCS[3]", BONITO_DEV_BASE + 3 * 256 * KiB,
256 * KiB);
memory_region_init_alias(pcimem_alias, NULL, "pci.mem.alias",
&bs->pci_mem, 0, BONITO_PCIHI_SIZE);
memory_region_add_subregion(host_mem, BONITO_PCIHI_BASE, pcimem_alias);
- create_unimplemented_device("PCI_2",
+ create_unimplemented_device(OBJECT(dev), "PCI_2",
(hwaddr)BONITO_PCIHI_BASE + BONITO_PCIHI_SIZE,
2 * GiB);
diff --git a/hw/riscv/k230.c b/hw/riscv/k230.c
index d51ad08d87..901106d602 100644
--- a/hw/riscv/k230.c
+++ b/hw/riscv/k230.c
@@ -144,7 +144,7 @@ static void k230_create_uart(Object *parent, MemoryRegion *sys_mem,
g_autofree char *name = g_strdup_printf("uart%d", index);
/* Cover the non-16550 part of the SDK's 0x1000 UART window. */
- create_unimplemented_device(name, memmap[uart_dev].base,
+ create_unimplemented_device(parent, name, memmap[uart_dev].base,
memmap[uart_dev].size);
serial_mm_init(parent, sys_mem, memmap[uart_dev].base, 2,
@@ -154,6 +154,7 @@ static void k230_create_uart(Object *parent, MemoryRegion *sys_mem,
static void k230_soc_realize(DeviceState *dev, Error **errp)
{
+ Object *obj = OBJECT(dev);
K230SoCState *s = RISCV_K230_SOC(dev);
MemoryRegion *sys_mem = get_system_memory();
int c908_cpus;
@@ -209,164 +210,164 @@ static void k230_soc_realize(DeviceState *dev, Error **errp)
qdev_get_gpio_in(DEVICE(s->c908_plic), K230_WDT1_IRQ));
/* unimplemented devices */
- create_unimplemented_device("kpu.l2-cache",
+ create_unimplemented_device(obj, "kpu.l2-cache",
memmap[K230_DEV_KPU_L2_CACHE].base,
memmap[K230_DEV_KPU_L2_CACHE].size);
- create_unimplemented_device("kpu_cfg", memmap[K230_DEV_KPU_CFG].base,
+ create_unimplemented_device(obj, "kpu_cfg", memmap[K230_DEV_KPU_CFG].base,
memmap[K230_DEV_KPU_CFG].size);
- create_unimplemented_device("fft", memmap[K230_DEV_FFT].base,
+ create_unimplemented_device(obj, "fft", memmap[K230_DEV_FFT].base,
memmap[K230_DEV_FFT].size);
- create_unimplemented_device("2d-engine.ai",
+ create_unimplemented_device(obj, "2d-engine.ai",
memmap[K230_DEV_AI_2D_ENGINE].base,
memmap[K230_DEV_AI_2D_ENGINE].size);
- create_unimplemented_device("gsdma", memmap[K230_DEV_GSDMA].base,
+ create_unimplemented_device(obj, "gsdma", memmap[K230_DEV_GSDMA].base,
memmap[K230_DEV_GSDMA].size);
- create_unimplemented_device("dma", memmap[K230_DEV_DMA].base,
+ create_unimplemented_device(obj, "dma", memmap[K230_DEV_DMA].base,
memmap[K230_DEV_DMA].size);
- create_unimplemented_device("decomp-gzip",
+ create_unimplemented_device(obj, "decomp-gzip",
memmap[K230_DEV_DECOMP_GZIP].base,
memmap[K230_DEV_DECOMP_GZIP].size);
- create_unimplemented_device("2d-engine.non-ai",
+ create_unimplemented_device(obj, "2d-engine.non-ai",
memmap[K230_DEV_NON_AI_2D].base,
memmap[K230_DEV_NON_AI_2D].size);
- create_unimplemented_device("isp", memmap[K230_DEV_ISP].base,
+ create_unimplemented_device(obj, "isp", memmap[K230_DEV_ISP].base,
memmap[K230_DEV_ISP].size);
- create_unimplemented_device("dewarp", memmap[K230_DEV_DEWARP].base,
+ create_unimplemented_device(obj, "dewarp", memmap[K230_DEV_DEWARP].base,
memmap[K230_DEV_DEWARP].size);
- create_unimplemented_device("rx-csi", memmap[K230_DEV_RX_CSI].base,
+ create_unimplemented_device(obj, "rx-csi", memmap[K230_DEV_RX_CSI].base,
memmap[K230_DEV_RX_CSI].size);
- create_unimplemented_device("vpu", memmap[K230_DEV_H264].base,
+ create_unimplemented_device(obj, "vpu", memmap[K230_DEV_H264].base,
memmap[K230_DEV_H264].size);
- create_unimplemented_device("gpu", memmap[K230_DEV_2P5D].base,
+ create_unimplemented_device(obj, "gpu", memmap[K230_DEV_2P5D].base,
memmap[K230_DEV_2P5D].size);
- create_unimplemented_device("vo", memmap[K230_DEV_VO].base,
+ create_unimplemented_device(obj, "vo", memmap[K230_DEV_VO].base,
memmap[K230_DEV_VO].size);
- create_unimplemented_device("vo_cfg", memmap[K230_DEV_VO_CFG].base,
+ create_unimplemented_device(obj, "vo_cfg", memmap[K230_DEV_VO_CFG].base,
memmap[K230_DEV_VO_CFG].size);
- create_unimplemented_device("3d-engine", memmap[K230_DEV_3D_ENGINE].base,
+ create_unimplemented_device(obj, "3d-engine", memmap[K230_DEV_3D_ENGINE].base,
memmap[K230_DEV_3D_ENGINE].size);
- create_unimplemented_device("pmu", memmap[K230_DEV_PMU].base,
+ create_unimplemented_device(obj, "pmu", memmap[K230_DEV_PMU].base,
memmap[K230_DEV_PMU].size);
- create_unimplemented_device("rtc", memmap[K230_DEV_RTC].base,
+ create_unimplemented_device(obj, "rtc", memmap[K230_DEV_RTC].base,
memmap[K230_DEV_RTC].size);
- create_unimplemented_device("cmu", memmap[K230_DEV_CMU].base,
+ create_unimplemented_device(obj, "cmu", memmap[K230_DEV_CMU].base,
memmap[K230_DEV_CMU].size);
- create_unimplemented_device("rmu", memmap[K230_DEV_RMU].base,
+ create_unimplemented_device(obj, "rmu", memmap[K230_DEV_RMU].base,
memmap[K230_DEV_RMU].size);
- create_unimplemented_device("boot", memmap[K230_DEV_BOOT].base,
+ create_unimplemented_device(obj, "boot", memmap[K230_DEV_BOOT].base,
memmap[K230_DEV_BOOT].size);
- create_unimplemented_device("pwr", memmap[K230_DEV_PWR].base,
+ create_unimplemented_device(obj, "pwr", memmap[K230_DEV_PWR].base,
memmap[K230_DEV_PWR].size);
- create_unimplemented_device("ipcm", memmap[K230_DEV_MAILBOX].base,
+ create_unimplemented_device(obj, "ipcm", memmap[K230_DEV_MAILBOX].base,
memmap[K230_DEV_MAILBOX].size);
- create_unimplemented_device("iomux", memmap[K230_DEV_IOMUX].base,
+ create_unimplemented_device(obj, "iomux", memmap[K230_DEV_IOMUX].base,
memmap[K230_DEV_IOMUX].size);
- create_unimplemented_device("timer", memmap[K230_DEV_TIMER].base,
+ create_unimplemented_device(obj, "timer", memmap[K230_DEV_TIMER].base,
memmap[K230_DEV_TIMER].size);
- create_unimplemented_device("wdt0", memmap[K230_DEV_WDT0].base,
+ create_unimplemented_device(obj, "wdt0", memmap[K230_DEV_WDT0].base,
memmap[K230_DEV_WDT0].size);
- create_unimplemented_device("wdt1", memmap[K230_DEV_WDT1].base,
+ create_unimplemented_device(obj, "wdt1", memmap[K230_DEV_WDT1].base,
memmap[K230_DEV_WDT1].size);
- create_unimplemented_device("ts", memmap[K230_DEV_TS].base,
+ create_unimplemented_device(obj, "ts", memmap[K230_DEV_TS].base,
memmap[K230_DEV_TS].size);
- create_unimplemented_device("hdi", memmap[K230_DEV_HDI].base,
+ create_unimplemented_device(obj, "hdi", memmap[K230_DEV_HDI].base,
memmap[K230_DEV_HDI].size);
- create_unimplemented_device("stc", memmap[K230_DEV_STC].base,
+ create_unimplemented_device(obj, "stc", memmap[K230_DEV_STC].base,
memmap[K230_DEV_STC].size);
- create_unimplemented_device("security", memmap[K230_DEV_SECURITY].base,
+ create_unimplemented_device(obj, "security", memmap[K230_DEV_SECURITY].base,
memmap[K230_DEV_SECURITY].size);
- create_unimplemented_device("i2c0", memmap[K230_DEV_I2C0].base,
+ create_unimplemented_device(obj, "i2c0", memmap[K230_DEV_I2C0].base,
memmap[K230_DEV_I2C0].size);
- create_unimplemented_device("i2c1", memmap[K230_DEV_I2C1].base,
+ create_unimplemented_device(obj, "i2c1", memmap[K230_DEV_I2C1].base,
memmap[K230_DEV_I2C1].size);
- create_unimplemented_device("i2c2", memmap[K230_DEV_I2C2].base,
+ create_unimplemented_device(obj, "i2c2", memmap[K230_DEV_I2C2].base,
memmap[K230_DEV_I2C2].size);
- create_unimplemented_device("i2c3", memmap[K230_DEV_I2C3].base,
+ create_unimplemented_device(obj, "i2c3", memmap[K230_DEV_I2C3].base,
memmap[K230_DEV_I2C3].size);
- create_unimplemented_device("i2c4", memmap[K230_DEV_I2C4].base,
+ create_unimplemented_device(obj, "i2c4", memmap[K230_DEV_I2C4].base,
memmap[K230_DEV_I2C4].size);
- create_unimplemented_device("pwm", memmap[K230_DEV_PWM].base,
+ create_unimplemented_device(obj, "pwm", memmap[K230_DEV_PWM].base,
memmap[K230_DEV_PWM].size);
- create_unimplemented_device("gpio0", memmap[K230_DEV_GPIO0].base,
+ create_unimplemented_device(obj, "gpio0", memmap[K230_DEV_GPIO0].base,
memmap[K230_DEV_GPIO0].size);
- create_unimplemented_device("gpio1", memmap[K230_DEV_GPIO1].base,
+ create_unimplemented_device(obj, "gpio1", memmap[K230_DEV_GPIO1].base,
memmap[K230_DEV_GPIO1].size);
- create_unimplemented_device("adc", memmap[K230_DEV_ADC].base,
+ create_unimplemented_device(obj, "adc", memmap[K230_DEV_ADC].base,
memmap[K230_DEV_ADC].size);
- create_unimplemented_device("codec", memmap[K230_DEV_CODEC].base,
+ create_unimplemented_device(obj, "codec", memmap[K230_DEV_CODEC].base,
memmap[K230_DEV_CODEC].size);
- create_unimplemented_device("i2s", memmap[K230_DEV_I2S].base,
+ create_unimplemented_device(obj, "i2s", memmap[K230_DEV_I2S].base,
memmap[K230_DEV_I2S].size);
- create_unimplemented_device("usb0", memmap[K230_DEV_USB0].base,
+ create_unimplemented_device(obj, "usb0", memmap[K230_DEV_USB0].base,
memmap[K230_DEV_USB0].size);
- create_unimplemented_device("usb1", memmap[K230_DEV_USB1].base,
+ create_unimplemented_device(obj, "usb1", memmap[K230_DEV_USB1].base,
memmap[K230_DEV_USB1].size);
- create_unimplemented_device("sd0", memmap[K230_DEV_SD0].base,
+ create_unimplemented_device(obj, "sd0", memmap[K230_DEV_SD0].base,
memmap[K230_DEV_SD0].size);
- create_unimplemented_device("sd1", memmap[K230_DEV_SD1].base,
+ create_unimplemented_device(obj, "sd1", memmap[K230_DEV_SD1].base,
memmap[K230_DEV_SD1].size);
- create_unimplemented_device("qspi0", memmap[K230_DEV_QSPI0].base,
+ create_unimplemented_device(obj, "qspi0", memmap[K230_DEV_QSPI0].base,
memmap[K230_DEV_QSPI0].size);
- create_unimplemented_device("qspi1", memmap[K230_DEV_QSPI1].base,
+ create_unimplemented_device(obj, "qspi1", memmap[K230_DEV_QSPI1].base,
memmap[K230_DEV_QSPI1].size);
- create_unimplemented_device("spi", memmap[K230_DEV_SPI].base,
+ create_unimplemented_device(obj, "spi", memmap[K230_DEV_SPI].base,
memmap[K230_DEV_SPI].size);
- create_unimplemented_device("hi_sys_cfg", memmap[K230_DEV_HI_SYS_CFG].base,
+ create_unimplemented_device(obj, "hi_sys_cfg", memmap[K230_DEV_HI_SYS_CFG].base,
memmap[K230_DEV_HI_SYS_CFG].size);
- create_unimplemented_device("ddrc_cfg", memmap[K230_DEV_DDRC_CFG].base,
+ create_unimplemented_device(obj, "ddrc_cfg", memmap[K230_DEV_DDRC_CFG].base,
memmap[K230_DEV_DDRC_CFG].size);
- create_unimplemented_device("flash", memmap[K230_DEV_FLASH].base,
+ create_unimplemented_device(obj, "flash", memmap[K230_DEV_FLASH].base,
memmap[K230_DEV_FLASH].size);
}
diff --git a/hw/riscv/microblaze-v-generic.c b/hw/riscv/microblaze-v-generic.c
index fbfdec7ede..7253ae7822 100644
--- a/hw/riscv/microblaze-v-generic.c
+++ b/hw/riscv/microblaze-v-generic.c
@@ -166,11 +166,11 @@ static void mb_v_generic_init(MachineState *machine)
sysbus_connect_irq(SYS_BUS_DEVICE(dma), 1, irq[AXIDMA_IRQ1]);
/* unimplemented devices */
- create_unimplemented_device("gpio", GPIO_BASEADDR, 0x10000);
- create_unimplemented_device("gpio2", GPIO_BASEADDR2, 0x10000);
- create_unimplemented_device("gpio3", GPIO_BASEADDR3, 0x10000);
- create_unimplemented_device("i2c", I2C_BASEADDR, 0x10000);
- create_unimplemented_device("qspi", QSPI_BASEADDR, 0x10000);
+ create_unimplemented_device(OBJECT(machine), "gpio", GPIO_BASEADDR, 0x10000);
+ create_unimplemented_device(OBJECT(machine), "gpio2", GPIO_BASEADDR2, 0x10000);
+ create_unimplemented_device(OBJECT(machine), "gpio3", GPIO_BASEADDR3, 0x10000);
+ create_unimplemented_device(OBJECT(machine), "i2c", I2C_BASEADDR, 0x10000);
+ create_unimplemented_device(OBJECT(machine), "qspi", QSPI_BASEADDR, 0x10000);
}
static void mb_v_generic_machine_init(MachineClass *mc)
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index 0d298aa3fc..0a98ac1c5e 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -233,19 +233,19 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
e51_dtim_mem);
/* Bus Error Units */
- create_unimplemented_device("microchip.pfsoc.buserr_unit0_mem",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.buserr_unit0_mem",
memmap[MICROCHIP_PFSOC_BUSERR_UNIT0].base,
memmap[MICROCHIP_PFSOC_BUSERR_UNIT0].size);
- create_unimplemented_device("microchip.pfsoc.buserr_unit1_mem",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.buserr_unit1_mem",
memmap[MICROCHIP_PFSOC_BUSERR_UNIT1].base,
memmap[MICROCHIP_PFSOC_BUSERR_UNIT1].size);
- create_unimplemented_device("microchip.pfsoc.buserr_unit2_mem",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.buserr_unit2_mem",
memmap[MICROCHIP_PFSOC_BUSERR_UNIT2].base,
memmap[MICROCHIP_PFSOC_BUSERR_UNIT2].size);
- create_unimplemented_device("microchip.pfsoc.buserr_unit3_mem",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.buserr_unit3_mem",
memmap[MICROCHIP_PFSOC_BUSERR_UNIT3].base,
memmap[MICROCHIP_PFSOC_BUSERR_UNIT3].size);
- create_unimplemented_device("microchip.pfsoc.buserr_unit4_mem",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.buserr_unit4_mem",
memmap[MICROCHIP_PFSOC_BUSERR_UNIT4].base,
memmap[MICROCHIP_PFSOC_BUSERR_UNIT4].size);
@@ -259,7 +259,7 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
iks->clint_timebase_freq, false);
/* L2 cache controller */
- create_unimplemented_device("microchip.pfsoc.l2cc",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.l2cc",
memmap[MICROCHIP_PFSOC_L2CC].base, memmap[MICROCHIP_PFSOC_L2CC].size);
/*
@@ -314,17 +314,17 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
MICROCHIP_PFSOC_MAILBOX_IRQ));
/* AXISW */
- create_unimplemented_device("microchip.pfsoc.axisw",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.axisw",
memmap[MICROCHIP_PFSOC_AXISW].base,
memmap[MICROCHIP_PFSOC_AXISW].size);
/* MPUCFG */
- create_unimplemented_device("microchip.pfsoc.mpucfg",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.mpucfg",
memmap[MICROCHIP_PFSOC_MPUCFG].base,
memmap[MICROCHIP_PFSOC_MPUCFG].size);
/* FMETER */
- create_unimplemented_device("microchip.pfsoc.fmeter",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.fmeter",
memmap[MICROCHIP_PFSOC_FMETER].base,
memmap[MICROCHIP_PFSOC_FMETER].size);
@@ -368,48 +368,48 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
serial_hd(4));
/* Watchdogs */
- create_unimplemented_device("microchip.pfsoc.watchdog0",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.watchdog0",
memmap[MICROCHIP_PFSOC_WDOG0].base,
memmap[MICROCHIP_PFSOC_WDOG0].size);
- create_unimplemented_device("microchip.pfsoc.watchdog1",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.watchdog1",
memmap[MICROCHIP_PFSOC_WDOG1].base,
memmap[MICROCHIP_PFSOC_WDOG1].size);
- create_unimplemented_device("microchip.pfsoc.watchdog2",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.watchdog2",
memmap[MICROCHIP_PFSOC_WDOG2].base,
memmap[MICROCHIP_PFSOC_WDOG2].size);
- create_unimplemented_device("microchip.pfsoc.watchdog3",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.watchdog3",
memmap[MICROCHIP_PFSOC_WDOG3].base,
memmap[MICROCHIP_PFSOC_WDOG3].size);
- create_unimplemented_device("microchip.pfsoc.watchdog4",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.watchdog4",
memmap[MICROCHIP_PFSOC_WDOG4].base,
memmap[MICROCHIP_PFSOC_WDOG4].size);
/* SPI */
- create_unimplemented_device("microchip.pfsoc.spi0",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.spi0",
memmap[MICROCHIP_PFSOC_SPI0].base,
memmap[MICROCHIP_PFSOC_SPI0].size);
- create_unimplemented_device("microchip.pfsoc.spi1",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.spi1",
memmap[MICROCHIP_PFSOC_SPI1].base,
memmap[MICROCHIP_PFSOC_SPI1].size);
/* I2C */
- create_unimplemented_device("microchip.pfsoc.i2c0",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.i2c0",
memmap[MICROCHIP_PFSOC_I2C0].base,
memmap[MICROCHIP_PFSOC_I2C0].size);
- create_unimplemented_device("microchip.pfsoc.i2c1",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.i2c1",
memmap[MICROCHIP_PFSOC_I2C1].base,
memmap[MICROCHIP_PFSOC_I2C1].size);
/* CAN */
- create_unimplemented_device("microchip.pfsoc.can0",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.can0",
memmap[MICROCHIP_PFSOC_CAN0].base,
memmap[MICROCHIP_PFSOC_CAN0].size);
- create_unimplemented_device("microchip.pfsoc.can1",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.can1",
memmap[MICROCHIP_PFSOC_CAN1].base,
memmap[MICROCHIP_PFSOC_CAN1].size);
/* USB */
- create_unimplemented_device("microchip.pfsoc.usb",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.usb",
memmap[MICROCHIP_PFSOC_USB].base,
memmap[MICROCHIP_PFSOC_USB].size);
@@ -440,13 +440,13 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_GEM1_IRQ));
/* GPIOs */
- create_unimplemented_device("microchip.pfsoc.gpio0",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.gpio0",
memmap[MICROCHIP_PFSOC_GPIO0].base,
memmap[MICROCHIP_PFSOC_GPIO0].size);
- create_unimplemented_device("microchip.pfsoc.gpio1",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.gpio1",
memmap[MICROCHIP_PFSOC_GPIO1].base,
memmap[MICROCHIP_PFSOC_GPIO1].size);
- create_unimplemented_device("microchip.pfsoc.gpio2",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.gpio2",
memmap[MICROCHIP_PFSOC_GPIO2].base,
memmap[MICROCHIP_PFSOC_GPIO2].size);
@@ -467,15 +467,15 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
MICROCHIP_PFSOC_MAILBOX_IRQ));
/* FPGA Fabric */
- create_unimplemented_device("microchip.pfsoc.fabricfic3",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.fabricfic3",
memmap[MICROCHIP_PFSOC_FABRIC_FIC3].base,
memmap[MICROCHIP_PFSOC_FABRIC_FIC3].size);
/* FPGA Fabric */
- create_unimplemented_device("microchip.pfsoc.fabricfic0",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.fabricfic0",
memmap[MICROCHIP_PFSOC_FABRIC_FIC0].base,
memmap[MICROCHIP_PFSOC_FABRIC_FIC0].size);
/* FPGA Fabric */
- create_unimplemented_device("microchip.pfsoc.fabricfic1",
+ create_unimplemented_device(OBJECT(dev), "microchip.pfsoc.fabricfic1",
memmap[MICROCHIP_PFSOC_FABRIC_FIC1].base,
memmap[MICROCHIP_PFSOC_FABRIC_FIC1].size);
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
index 5b2f33d5ac..76653ccc77 100644
--- a/hw/riscv/opentitan.c
+++ b/hw/riscv/opentitan.c
@@ -258,57 +258,57 @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
}
}
- create_unimplemented_device("riscv.lowrisc.ibex.gpio",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.gpio",
memmap[IBEX_DEV_GPIO].base, memmap[IBEX_DEV_GPIO].size);
- create_unimplemented_device("riscv.lowrisc.ibex.spi_device",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.spi_device",
memmap[IBEX_DEV_SPI_DEVICE].base, memmap[IBEX_DEV_SPI_DEVICE].size);
- create_unimplemented_device("riscv.lowrisc.ibex.i2c",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.i2c",
memmap[IBEX_DEV_I2C].base, memmap[IBEX_DEV_I2C].size);
- create_unimplemented_device("riscv.lowrisc.ibex.pattgen",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.pattgen",
memmap[IBEX_DEV_PATTGEN].base, memmap[IBEX_DEV_PATTGEN].size);
- create_unimplemented_device("riscv.lowrisc.ibex.sensor_ctrl",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.sensor_ctrl",
memmap[IBEX_DEV_SENSOR_CTRL].base, memmap[IBEX_DEV_SENSOR_CTRL].size);
- create_unimplemented_device("riscv.lowrisc.ibex.otp_ctrl",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.otp_ctrl",
memmap[IBEX_DEV_OTP_CTRL].base, memmap[IBEX_DEV_OTP_CTRL].size);
- create_unimplemented_device("riscv.lowrisc.ibex.lc_ctrl",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.lc_ctrl",
memmap[IBEX_DEV_LC_CTRL].base, memmap[IBEX_DEV_LC_CTRL].size);
- create_unimplemented_device("riscv.lowrisc.ibex.pwrmgr",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.pwrmgr",
memmap[IBEX_DEV_PWRMGR].base, memmap[IBEX_DEV_PWRMGR].size);
- create_unimplemented_device("riscv.lowrisc.ibex.rstmgr",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.rstmgr",
memmap[IBEX_DEV_RSTMGR].base, memmap[IBEX_DEV_RSTMGR].size);
- create_unimplemented_device("riscv.lowrisc.ibex.clkmgr",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.clkmgr",
memmap[IBEX_DEV_CLKMGR].base, memmap[IBEX_DEV_CLKMGR].size);
- create_unimplemented_device("riscv.lowrisc.ibex.pinmux",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.pinmux",
memmap[IBEX_DEV_PINMUX].base, memmap[IBEX_DEV_PINMUX].size);
- create_unimplemented_device("riscv.lowrisc.ibex.aon_timer",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.aon_timer",
memmap[IBEX_DEV_AON_TIMER].base, memmap[IBEX_DEV_AON_TIMER].size);
- create_unimplemented_device("riscv.lowrisc.ibex.usbdev",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.usbdev",
memmap[IBEX_DEV_USBDEV].base, memmap[IBEX_DEV_USBDEV].size);
- create_unimplemented_device("riscv.lowrisc.ibex.flash_ctrl",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.flash_ctrl",
memmap[IBEX_DEV_FLASH_CTRL].base, memmap[IBEX_DEV_FLASH_CTRL].size);
- create_unimplemented_device("riscv.lowrisc.ibex.aes",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.aes",
memmap[IBEX_DEV_AES].base, memmap[IBEX_DEV_AES].size);
- create_unimplemented_device("riscv.lowrisc.ibex.hmac",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.hmac",
memmap[IBEX_DEV_HMAC].base, memmap[IBEX_DEV_HMAC].size);
- create_unimplemented_device("riscv.lowrisc.ibex.kmac",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.kmac",
memmap[IBEX_DEV_KMAC].base, memmap[IBEX_DEV_KMAC].size);
- create_unimplemented_device("riscv.lowrisc.ibex.keymgr",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.keymgr",
memmap[IBEX_DEV_KEYMGR].base, memmap[IBEX_DEV_KEYMGR].size);
- create_unimplemented_device("riscv.lowrisc.ibex.csrng",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.csrng",
memmap[IBEX_DEV_CSRNG].base, memmap[IBEX_DEV_CSRNG].size);
- create_unimplemented_device("riscv.lowrisc.ibex.entropy",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.entropy",
memmap[IBEX_DEV_ENTROPY].base, memmap[IBEX_DEV_ENTROPY].size);
- create_unimplemented_device("riscv.lowrisc.ibex.edn0",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.edn0",
memmap[IBEX_DEV_EDNO].base, memmap[IBEX_DEV_EDNO].size);
- create_unimplemented_device("riscv.lowrisc.ibex.edn1",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.edn1",
memmap[IBEX_DEV_EDN1].base, memmap[IBEX_DEV_EDN1].size);
- create_unimplemented_device("riscv.lowrisc.ibex.alert_handler",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.alert_handler",
memmap[IBEX_DEV_ALERT_HANDLER].base, memmap[IBEX_DEV_ALERT_HANDLER].size);
- create_unimplemented_device("riscv.lowrisc.ibex.sram_ctrl",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.sram_ctrl",
memmap[IBEX_DEV_SRAM_CTRL].base, memmap[IBEX_DEV_SRAM_CTRL].size);
- create_unimplemented_device("riscv.lowrisc.ibex.otbn",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.otbn",
memmap[IBEX_DEV_OTBN].base, memmap[IBEX_DEV_OTBN].size);
- create_unimplemented_device("riscv.lowrisc.ibex.ibex_cfg",
+ create_unimplemented_device(OBJECT(dev_soc), "riscv.lowrisc.ibex.ibex_cfg",
memmap[IBEX_DEV_IBEX_CFG].base, memmap[IBEX_DEV_IBEX_CFG].size);
}
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
index fb62bc9aca..31cec460b3 100644
--- a/hw/riscv/sifive_e.c
+++ b/hw/riscv/sifive_e.c
@@ -268,19 +268,19 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
sifive_uart_create(OBJECT(s), sys_mem, memmap[SIFIVE_E_DEV_UART0].base,
serial_hd(0), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_E_UART0_IRQ));
- create_unimplemented_device("riscv.sifive.e.qspi0",
+ create_unimplemented_device(OBJECT(dev), "riscv.sifive.e.qspi0",
memmap[SIFIVE_E_DEV_QSPI0].base, memmap[SIFIVE_E_DEV_QSPI0].size);
- create_unimplemented_device("riscv.sifive.e.pwm0",
+ create_unimplemented_device(OBJECT(dev), "riscv.sifive.e.pwm0",
memmap[SIFIVE_E_DEV_PWM0].base, memmap[SIFIVE_E_DEV_PWM0].size);
sifive_uart_create(OBJECT(s), sys_mem, memmap[SIFIVE_E_DEV_UART1].base,
serial_hd(1), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_E_UART1_IRQ));
- create_unimplemented_device("riscv.sifive.e.qspi1",
+ create_unimplemented_device(OBJECT(dev), "riscv.sifive.e.qspi1",
memmap[SIFIVE_E_DEV_QSPI1].base, memmap[SIFIVE_E_DEV_QSPI1].size);
- create_unimplemented_device("riscv.sifive.e.pwm1",
+ create_unimplemented_device(OBJECT(dev), "riscv.sifive.e.pwm1",
memmap[SIFIVE_E_DEV_PWM1].base, memmap[SIFIVE_E_DEV_PWM1].size);
- create_unimplemented_device("riscv.sifive.e.qspi2",
+ create_unimplemented_device(OBJECT(dev), "riscv.sifive.e.qspi2",
memmap[SIFIVE_E_DEV_QSPI2].base, memmap[SIFIVE_E_DEV_QSPI2].size);
- create_unimplemented_device("riscv.sifive.e.pwm2",
+ create_unimplemented_device(OBJECT(dev), "riscv.sifive.e.pwm2",
memmap[SIFIVE_E_DEV_PWM2].base, memmap[SIFIVE_E_DEV_PWM2].size);
/* Flash memory */
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index 3d60a501dd..aba6716b73 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -861,13 +861,13 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
}
}
- create_unimplemented_device("riscv.sifive.u.gem-mgmt",
+ create_unimplemented_device(OBJECT(dev), "riscv.sifive.u.gem-mgmt",
memmap[SIFIVE_U_DEV_GEM_MGMT].base, memmap[SIFIVE_U_DEV_GEM_MGMT].size);
- create_unimplemented_device("riscv.sifive.u.dmc",
+ create_unimplemented_device(OBJECT(dev), "riscv.sifive.u.dmc",
memmap[SIFIVE_U_DEV_DMC].base, memmap[SIFIVE_U_DEV_DMC].size);
- create_unimplemented_device("riscv.sifive.u.l2cc",
+ create_unimplemented_device(OBJECT(dev), "riscv.sifive.u.l2cc",
memmap[SIFIVE_U_DEV_L2CC].base, memmap[SIFIVE_U_DEV_L2CC].size);
sysbus_realize(SYS_BUS_DEVICE(&s->spi0), errp);
diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c
index 57ced817e3..9ae5af3162 100644
--- a/hw/riscv/tt_atlantis.c
+++ b/hw/riscv/tt_atlantis.c
@@ -557,7 +557,7 @@ static void tt_atlantis_machine_init(MachineState *machine)
* Create an unimplemented device region so writes don't fault
* and reads return zero, which keeps Linux happy.
*/
- create_unimplemented_device("tt-atlantis.uart0",
+ create_unimplemented_device(OBJECT(machine), "tt-atlantis.uart0",
s->memmap[TT_ATL_UART1].base,
s->memmap[TT_ATL_UART1].size);
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 144345d46a..a0d0213d0b 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -948,7 +948,7 @@ static void sun4m_hw_init(MachineState *machine)
}
if (hwdef->sx_base) {
- create_unimplemented_device("sun-sx", hwdef->sx_base, 0x2000);
+ create_unimplemented_device(OBJECT(machine), "sun-sx", hwdef->sx_base, 0x2000);
}
dev = qdev_new(OBJECT(machine), "nvram", "sysbus-m48t08");
@@ -1032,16 +1032,16 @@ static void sun4m_hw_init(MachineState *machine)
if (hwdef->dbri_base) {
/* ISDN chip with attached CS4215 audio codec */
/* prom space */
- create_unimplemented_device("sun-DBRI.prom",
+ create_unimplemented_device(OBJECT(machine), "sun-DBRI.prom",
hwdef->dbri_base + 0x1000, 0x30);
/* reg space */
- create_unimplemented_device("sun-DBRI",
+ create_unimplemented_device(OBJECT(machine), "sun-DBRI",
hwdef->dbri_base + 0x10000, 0x100);
}
if (hwdef->bpp_base) {
/* parallel port */
- create_unimplemented_device("sun-bpp", hwdef->bpp_base, 0x20);
+ create_unimplemented_device(OBJECT(machine), "sun-bpp", hwdef->bpp_base, 0x20);
}
initrd_size = 0;
diff --git a/hw/sparc64/niagara.c b/hw/sparc64/niagara.c
index bceda70f2e..8fb9937127 100644
--- a/hw/sparc64/niagara.c
+++ b/hw/sparc64/niagara.c
@@ -98,6 +98,7 @@ static void add_rom_or_fail(const char *file, const hwaddr addr)
/* Niagara hardware initialisation */
static void niagara_init(MachineState *machine)
{
+ Object *obj = OBJECT(machine);
NiagaraBoardState *s = g_new(NiagaraBoardState, 1);
DriveInfo *dinfo = drive_get(IF_PFLASH, 0, 0);
MemoryRegion *sysmem = get_system_memory();
@@ -153,7 +154,7 @@ static void niagara_init(MachineState *machine)
}
serial_mm_init(OBJECT(machine), sysmem, NIAGARA_UART_BASE, 0, NULL,
115200, serial_hd(0), DEVICE_BIG_ENDIAN);
- create_unimplemented_device("sun4v-iob", NIAGARA_IOBBASE, NIAGARA_IOBSIZE);
+ create_unimplemented_device(obj, "sun4v-iob", NIAGARA_IOBBASE, NIAGARA_IOBSIZE);
sun4v_rtc_init(OBJECT(machine), NIAGARA_RTC_BASE);
}
diff --git a/include/hw/misc/unimp.h b/include/hw/misc/unimp.h
index 5158d29634..afef25671e 100644
--- a/include/hw/misc/unimp.h
+++ b/include/hw/misc/unimp.h
@@ -38,15 +38,18 @@ struct UnimplementedDeviceState {
* use it to cover a large region and then map other devices on top of it
* if necessary.
*/
-static inline void create_unimplemented_device(const char *name,
+static inline void create_unimplemented_device(Object *parent,
+ const char *name,
hwaddr base,
hwaddr size)
{
- DeviceState *dev = qdev_new_orphan(TYPE_UNIMPLEMENTED_DEVICE);
+ g_autofree char *id = name[strlen(name) - 1] == ']'
+ ? g_strdup(name) : g_strdup_printf("%s[*]", name);
+ DeviceState *dev = qdev_new(parent, id, TYPE_UNIMPLEMENTED_DEVICE);
qdev_prop_set_string(dev, "name", name);
qdev_prop_set_uint64(dev, "size", size);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map_overlap(SYS_BUS_DEVICE(dev), 0, base, -1000);
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 077/134] hw/usb: Give -usbdevice and auto-hub devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (75 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 076/134] hw/misc/unimp: Give create_unimplemented_device() " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 078/134] hw/audio: Give -audio model= " Alexander Graf
` (57 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
The three remaining orphan-creating sites in hw/usb are all
command-line and hotplug-adjacent code paths that always run after
the machine is up:
usb_claim_port() auto-hub -> child of the USB host controller
(bus->qbus.parent)
usbdevice_create() -> /machine/peripheral-anon, same as
-device without id=
usb_braille_init() -> ditto (a .usbdevice_init callback)
Switch to qdev_new()/qdev_try_new() with an explicit parent and use
plain qdev_realize() since the reference is now held by the parent's
child<> property.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/usb/bus.c | 15 ++++++++++-----
hw/usb/dev-serial.c | 3 ++-
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index d45cce7666..725b0303b1 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -410,9 +410,10 @@ void usb_claim_port(USBDevice *dev, Error **errp)
} else {
if (bus->nfree == 1 && strcmp(object_get_typename(OBJECT(dev)), "usb-hub") != 0) {
/* Create a new hub and chain it on */
- hub = USB_DEVICE(qdev_try_new_orphan("usb-hub"));
+ hub = USB_DEVICE(qdev_try_new(OBJECT(bus->qbus.parent),
+ "auto-hub[*]", "usb-hub"));
if (hub) {
- usb_realize_and_unref(hub, bus, NULL);
+ qdev_realize(DEVICE(hub), &bus->qbus, NULL);
}
}
if (bus->nfree == 0) {
@@ -661,13 +662,17 @@ USBDevice *usbdevice_create(const char *driver)
return NULL;
}
- dev = f->usbdevice_init ? f->usbdevice_init()
- : USB_DEVICE(qdev_new_orphan(f->name));
+ if (f->usbdevice_init) {
+ dev = f->usbdevice_init();
+ } else {
+ dev = USB_DEVICE(qdev_new(machine_get_container("peripheral-anon"),
+ "usbdevice[*]", f->name));
+ }
if (!dev) {
error_report("Failed to create USB device '%s'", f->name);
return NULL;
}
- if (!usb_realize_and_unref(dev, bus, &err)) {
+ if (!qdev_realize(DEVICE(dev), &bus->qbus, &err)) {
error_reportf_err(err, "Failed to initialize USB device '%s': ",
f->name);
object_unparent(OBJECT(dev));
diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c
index 81897b2d76..4ae3faf656 100644
--- a/hw/usb/dev-serial.c
+++ b/hw/usb/dev-serial.c
@@ -622,7 +622,8 @@ static USBDevice *usb_braille_init(void)
return NULL;
}
- dev = USB_DEVICE(qdev_new_orphan("usb-braille"));
+ dev = USB_DEVICE(qdev_new(machine_get_container("peripheral-anon"),
+ "usbdevice[*]", "usb-braille"));
qdev_prop_set_chr(&dev->qdev, "chardev", cdrv);
return dev;
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 078/134] hw/audio: Give -audio model= devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (76 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 077/134] hw/usb: Give -usbdevice and auto-hub devices " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 079/134] hw/xen: Give xenstore-driven backend " Alexander Graf
` (56 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
audio_model_devices_init() is the '-audio model=' command-line path,
so parent the created device under /machine/peripheral-anon like
-device without id= would.
The intel-hda .init helper for '-audio model=hda' additionally
creates an hda-duplex codec on the controller's HDA bus; the codec
is a natural child of the controller device it just spawned.
Both sites drop the extra unref: the child<> property now holds the
reference.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/audio/intel-hda.c | 4 ++--
hw/audio/model.c | 5 +++--
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/hw/audio/intel-hda.c b/hw/audio/intel-hda.c
index cd4743a405..f51c98511a 100644
--- a/hw/audio/intel-hda.c
+++ b/hw/audio/intel-hda.c
@@ -1313,9 +1313,9 @@ static void intel_hda_and_codec_init(const char *audiodev)
intel_hda = qdev_device_add_from_qdict(props, false, &error_fatal);
hdabus = QLIST_FIRST(&intel_hda->child_bus);
- codec = qdev_new_orphan("hda-duplex");
+ codec = qdev_new(OBJECT(intel_hda), "codec", "hda-duplex");
qdev_prop_set_string(codec, "audiodev", audiodev);
- qdev_realize_and_unref(codec, hdabus, &error_fatal);
+ qdev_realize(codec, hdabus, &error_fatal);
object_unref(intel_hda);
}
diff --git a/hw/audio/model.c b/hw/audio/model.c
index bd8ca35153..308b899459 100644
--- a/hw/audio/model.c
+++ b/hw/audio/model.c
@@ -110,10 +110,11 @@ void audio_model_init(void)
}
if (c->typename) {
- DeviceState *dev = qdev_new_orphan(c->typename);
+ DeviceState *dev = qdev_new(machine_get_container("peripheral-anon"),
+ "audio[*]", c->typename);
BusState *bus = qdev_find_default_bus(DEVICE_GET_CLASS(dev), &error_fatal);
qdev_prop_set_string(dev, "audiodev", audiodev_id);
- qdev_realize_and_unref(dev, bus, &error_fatal);
+ qdev_realize(dev, bus, &error_fatal);
} else {
c->init(audiodev_id);
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 079/134] hw/xen: Give xenstore-driven backend devices a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (77 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 078/134] hw/audio: Give -audio model= " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 080/134] hw/nitro: Give the vsock bridge " Alexander Graf
` (55 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
The XenBackendInfo .create callbacks (vif, console, vbd) create a
XenDevice in response to xenstore hotplug events. The lifetime
owner is the xen-bridge device that hosts the XenBus, so parent
each device there. The failure paths already call object_unparent()
so nothing else changes; the reference previously dropped by
qdev_realize_and_unref() is now the parent's child<> property.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/block/xen-block.c | 5 +++--
hw/char/xen_console.c | 5 +++--
hw/net/xen_nic.c | 5 +++--
3 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index 9dd69faa02..46d94a9a95 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -1074,7 +1074,8 @@ static void xen_block_device_create(XenBackendInstance *backend,
goto fail;
}
- xendev = XEN_DEVICE(qdev_new_orphan(type));
+ xendev = XEN_DEVICE(qdev_new(OBJECT(BUS(xenbus)->parent), "vbd[*]",
+ type));
blockdev = XEN_BLOCK_DEVICE(xendev);
if (!object_property_set_str(OBJECT(xendev), "vdev", vdev,
@@ -1099,7 +1100,7 @@ static void xen_block_device_create(XenBackendInstance *backend,
blockdev->iothread = iothread;
blockdev->drive = drive;
- if (!qdev_realize_and_unref(DEVICE(xendev), BUS(xenbus), errp)) {
+ if (!qdev_realize(DEVICE(xendev), BUS(xenbus), errp)) {
error_prepend(errp, "realization of device %s failed: ", type);
goto fail;
}
diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c
index cd440b82f4..40449b34e8 100644
--- a/hw/char/xen_console.c
+++ b/hw/char/xen_console.c
@@ -562,7 +562,8 @@ static void xen_console_device_create(XenBackendInstance *backend,
goto fail;
}
- xendev = XEN_DEVICE(qdev_new_orphan(TYPE_XEN_CONSOLE_DEVICE));
+ xendev = XEN_DEVICE(qdev_new(OBJECT(BUS(xenbus)->parent), "console[*]",
+ TYPE_XEN_CONSOLE_DEVICE));
con = XEN_CONSOLE_DEVICE(xendev);
con->dev = number;
@@ -610,7 +611,7 @@ static void xen_console_device_create(XenBackendInstance *backend,
goto fail;
}
- if (qdev_realize_and_unref(DEVICE(xendev), BUS(xenbus), errp)) {
+ if (qdev_realize(DEVICE(xendev), BUS(xenbus), errp)) {
xen_backend_set_device(backend, xendev);
goto done;
}
diff --git a/hw/net/xen_nic.c b/hw/net/xen_nic.c
index 212281aac7..ff748ae070 100644
--- a/hw/net/xen_nic.c
+++ b/hw/net/xen_nic.c
@@ -619,13 +619,14 @@ static void xen_net_device_create(XenBackendInstance *backend,
goto fail;
}
- xendev = XEN_DEVICE(qdev_new_orphan(TYPE_XEN_NET_DEVICE));
+ xendev = XEN_DEVICE(qdev_new(OBJECT(BUS(xenbus)->parent), "vif[*]",
+ TYPE_XEN_NET_DEVICE));
net = XEN_NET_DEVICE(xendev);
net->dev = number;
memcpy(&net->conf.macaddr, &mac, sizeof(mac));
- if (qdev_realize_and_unref(DEVICE(xendev), BUS(xenbus), errp)) {
+ if (qdev_realize(DEVICE(xendev), BUS(xenbus), errp)) {
xen_backend_set_device(backend, xendev);
return;
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 080/134] hw/nitro: Give the vsock bridge a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (78 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 079/134] hw/xen: Give xenstore-driven backend " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 081/134] hw/isa: Give the isabus-bridge " Alexander Graf
` (54 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
nitro_vsock_bridge_create() was using qdev_set_id() to slot the
bridge under /machine/peripheral. The bridge is a board-owned
singleton created from nitro_machine_init(), so make it a plain
child of the machine and drop the qdev_set_id() indirection.
The heartbeat device that hangs off the bridge is already a child<>
of it, so the composition tree becomes:
/machine/nitro-vsock (nitro-vsock-bridge)
/machine/nitro-vsock/heartbeat (nitro-heartbeat)
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/nitro/machine.c | 2 +-
hw/nitro/nitro-vsock-bus.c | 9 ++++-----
include/hw/nitro/nitro-vsock-bus.h | 2 +-
3 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/hw/nitro/machine.c b/hw/nitro/machine.c
index 6b61de911f..e522eae5ba 100644
--- a/hw/nitro/machine.c
+++ b/hw/nitro/machine.c
@@ -194,7 +194,7 @@ static void nitro_machine_init(MachineState *machine)
MEMTXATTRS_UNSPECIFIED, eif_data, eif_size);
if (defaults_enabled()) {
- NitroVsockBridge *bridge = nitro_vsock_bridge_create();
+ NitroVsockBridge *bridge = nitro_vsock_bridge_create(OBJECT(machine));
DeviceState *dev;
/* Nitro Enclaves require a heartbeat device. Provide one. */
diff --git a/hw/nitro/nitro-vsock-bus.c b/hw/nitro/nitro-vsock-bus.c
index f7540eaa54..2c4b66931f 100644
--- a/hw/nitro/nitro-vsock-bus.c
+++ b/hw/nitro/nitro-vsock-bus.c
@@ -20,7 +20,6 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
-#include "monitor/qdev.h"
#include "hw/core/sysbus.h"
#include "hw/nitro/nitro-vsock-bus.h"
@@ -46,12 +45,12 @@ void nitro_vsock_bridge_start_enclave(NitroVsockBridge *bridge,
}
}
-NitroVsockBridge *nitro_vsock_bridge_create(void)
+NitroVsockBridge *nitro_vsock_bridge_create(Object *parent)
{
- DeviceState *dev = qdev_new_orphan(TYPE_NITRO_VSOCK_BRIDGE);
+ DeviceState *dev = qdev_new(parent, "nitro-vsock",
+ TYPE_NITRO_VSOCK_BRIDGE);
- qdev_set_id(dev, g_strdup("nitro-vsock"), &error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
return NITRO_VSOCK_BRIDGE(dev);
}
diff --git a/include/hw/nitro/nitro-vsock-bus.h b/include/hw/nitro/nitro-vsock-bus.h
index 064260aa41..36f4dde78f 100644
--- a/include/hw/nitro/nitro-vsock-bus.h
+++ b/include/hw/nitro/nitro-vsock-bus.h
@@ -50,7 +50,7 @@ struct NitroVsockDeviceClass {
/*
* Machine helper to create the Nitro vsock bridge sysbus device.
*/
-NitroVsockBridge *nitro_vsock_bridge_create(void);
+NitroVsockBridge *nitro_vsock_bridge_create(Object *parent);
/*
* Find the Nitro vsock bridge on the sysbus.
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 081/134] hw/isa: Give the isabus-bridge a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (79 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 080/134] hw/nitro: Give the vsock bridge " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 082/134] net, target/mips: Give -nic and CPU-with-clock helpers " Alexander Graf
` (53 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
isa_bus_new(NULL, ...) implicitly created a sysbus "isabus-bridge"
and put the ISA bus on it. That bridge ended up under
/machine/unattached, which this series is deleting.
Split out an explicit isa_bus_new_bridge(parent, ...) helper for
the five boards that don't already have a south-bridge device to
own the ISA bus, and make plain isa_bus_new() require a non-NULL
device. Callers own the bridge in the composition tree:
hw/i386/microvm.c OBJECT(mms)
hw/i386/isapc.c OBJECT(machine)
hw/mips/jazz.c OBJECT(machine)
hw/hppa/machine.c parent (already threaded)
hw/ppc/pnv_lpc.c OBJECT(lpc) -- the LPC controller
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/hppa/machine.c | 2 +-
hw/i386/isapc.c | 2 +-
hw/i386/microvm.c | 2 +-
hw/isa/isa-bus.c | 21 +++++++++++----------
hw/mips/jazz.c | 2 +-
hw/ppc/pnv_lpc.c | 4 ++--
include/hw/isa/isa.h | 2 ++
7 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 002f4299cc..d52f27c51c 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -108,7 +108,7 @@ static ISABus *hppa_isa_bus(Object *parent, hwaddr addr)
NULL, "isa-io", 0x800);
memory_region_add_subregion(get_system_memory(), addr, isa_region);
- isa_bus = isa_bus_new(NULL, get_system_memory(), isa_region,
+ isa_bus = isa_bus_new_bridge(parent, get_system_memory(), isa_region,
&error_abort);
isa_irqs = i8259_init(parent, isa_bus, NULL);
isa_bus_register_input_irqs(isa_bus, isa_irqs);
diff --git a/hw/i386/isapc.c b/hw/i386/isapc.c
index 842ae94acb..e8d5767b80 100644
--- a/hw/i386/isapc.c
+++ b/hw/i386/isapc.c
@@ -108,7 +108,7 @@ static void pc_init_isa(MachineState *machine)
gsi_state = pc_gsi_create(&x86ms->gsi, false);
- isa_bus = isa_bus_new(NULL, system_memory, system_io,
+ isa_bus = isa_bus_new_bridge(OBJECT(machine), system_memory, system_io,
&error_abort);
isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 8c61106516..aa0e1ef155 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -171,7 +171,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
x86ms->gsi = qemu_allocate_irqs(gsi_handler, gsi_state,
IOAPIC_NUM_PINS * ioapics);
- isa_bus = isa_bus_new(NULL, get_system_memory(), get_system_io(),
+ isa_bus = isa_bus_new_bridge(OBJECT(mms), get_system_memory(), get_system_io(),
&error_abort);
isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c
index fb20c43869..7a6a595ce7 100644
--- a/hw/isa/isa-bus.c
+++ b/hw/isa/isa-bus.c
@@ -52,28 +52,29 @@ static const TypeInfo isa_bus_info = {
ISABus *isa_bus_new(DeviceState *dev, MemoryRegion* address_space,
MemoryRegion *address_space_io, Error **errp)
{
- DeviceState *bridge = NULL;
-
if (isabus) {
error_setg(errp, "Can't create a second ISA bus");
return NULL;
}
- if (!dev) {
- bridge = qdev_new_orphan("isabus-bridge");
- dev = bridge;
- }
+ g_assert(dev);
isabus = ISA_BUS(qbus_new(TYPE_ISA_BUS, dev, NULL));
isabus->address_space = address_space;
isabus->address_space_io = address_space_io;
- if (bridge) {
- sysbus_realize_and_unref(SYS_BUS_DEVICE(bridge), &error_fatal);
- }
-
return isabus;
}
+ISABus *isa_bus_new_bridge(Object *parent, MemoryRegion *address_space,
+ MemoryRegion *address_space_io, Error **errp)
+{
+ DeviceState *bridge = qdev_new(parent, "isabus-bridge", "isabus-bridge");
+ ISABus *bus = isa_bus_new(bridge, address_space, address_space_io, errp);
+
+ sysbus_realize(SYS_BUS_DEVICE(bridge), &error_fatal);
+ return bus;
+}
+
void isa_bus_register_input_irqs(ISABus *bus, qemu_irq *irqs_in)
{
bus->irqs_in = irqs_in;
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index 23d717d96a..8c52608913 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -283,7 +283,7 @@ static void mips_jazz_init(MachineState *machine,
memory_region_init(isa_mem, NULL, "isa-mem", 0x01000000);
memory_region_add_subregion(address_space, 0x90000000, isa_io);
memory_region_add_subregion(address_space, 0x91000000, isa_mem);
- isa_bus = isa_bus_new(NULL, isa_mem, isa_io, &error_abort);
+ isa_bus = isa_bus_new_bridge(OBJECT(machine), isa_mem, isa_io, &error_abort);
/* ISA devices */
i8259 = i8259_init(OBJECT(machine), isa_bus, env->irq[4]);
diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
index d1357dd359..6ae228088f 100644
--- a/hw/ppc/pnv_lpc.c
+++ b/hw/ppc/pnv_lpc.c
@@ -972,11 +972,11 @@ ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **errp)
qemu_irq *irqs;
qemu_irq_handler handler;
- /* let isa_bus_new() create its own bridge on SysBus otherwise
+ /* let isa_bus_new_bridge() create the bridge as a child of the LPC;
* devices specified on the command line won't find the bus and
* will fail to create.
*/
- isa_bus = isa_bus_new(NULL, &lpc->isa_mem, &lpc->isa_io, &local_err);
+ isa_bus = isa_bus_new_bridge(OBJECT(lpc), &lpc->isa_mem, &lpc->isa_io, &local_err);
if (local_err) {
error_propagate(errp, local_err);
return NULL;
diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h
index 9e35d88b1e..79bfe16361 100644
--- a/include/hw/isa/isa.h
+++ b/include/hw/isa/isa.h
@@ -69,6 +69,8 @@ struct ISADevice {
ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space,
MemoryRegion *address_space_io, Error **errp);
+ISABus *isa_bus_new_bridge(Object *parent, MemoryRegion *address_space,
+ MemoryRegion *address_space_io, Error **errp);
void isa_bus_register_input_irqs(ISABus *bus, qemu_irq *irqs_in);
void isa_bus_dma(ISABus *bus, IsaDma *dma8, IsaDma *dma16);
IsaDma *isa_bus_get_dma(ISABus *bus, int nchan);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 082/134] net, target/mips: Give -nic and CPU-with-clock helpers a QOM parent
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (80 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 081/134] hw/isa: Give the isabus-bridge " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 083/134] usb, ssi, i2c: Remove *_orphan() creator variants Alexander Graf
` (52 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
qemu_create_nic_device() and qemu_create_nic_bus_devices() are the
board-side and bus-side halves of the '-nic' command-line path.
Thread an explicit parent through the former (each of the seven
callers now supplies the machine or SoC that owns the on-board NIC)
and let the latter place devices under /machine/peripheral-anon
like -device does. s390 was already parenting the returned device
by hand; drop that now-redundant open-coding.
mips_cpu_create_with_clock() likewise gains an explicit parent; the
four MIPS boards pass the machine and name the CPU cpu[*].
xtensa_cpu_create_with_clock() has no callers, so just remove it.
For linux-user/bsd-user there is no machine and hence no composition
tree; open-code object_new()+qdev_realize() where cpu_create_orphan()
used to be.
While at it, fix a stale doc reference in migration.c.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
bsd-user/main.c | 3 ++-
hw/arm/exynos4_boards.c | 4 ++--
hw/hppa/machine.c | 4 ++--
hw/m68k/mcf5208.c | 4 ++--
hw/mips/fuloong2e.c | 3 ++-
hw/mips/jazz.c | 2 +-
hw/mips/loongson3_virt.c | 3 ++-
hw/mips/malta.c | 2 +-
hw/or1k/or1k-sim.c | 4 ++--
hw/s390x/s390-virtio-ccw.c | 8 +++-----
hw/vmapple/vmapple.c | 5 +++--
hw/xtensa/xtfpga.c | 4 ++--
include/net/net.h | 5 ++++-
linux-user/main.c | 6 ++++--
migration/migration.c | 2 +-
net/net.c | 10 ++++++----
target/mips/cpu.c | 5 +++--
target/mips/cpu.h | 3 ++-
target/xtensa/cpu.c | 11 -----------
target/xtensa/cpu.h | 2 --
20 files changed, 44 insertions(+), 46 deletions(-)
diff --git a/bsd-user/main.c b/bsd-user/main.c
index 618b1adf4d..d686c413a5 100644
--- a/bsd-user/main.c
+++ b/bsd-user/main.c
@@ -475,7 +475,8 @@ int main(int argc, char **argv)
set_preferred_target_page_bits(ctz32(host_page_size));
finalize_target_page_bits();
- cpu = cpu_create_orphan(cpu_type);
+ cpu = CPU(object_new(cpu_type));
+ qdev_realize(DEVICE(cpu), NULL, &error_fatal);
env = cpu_env(cpu);
cpu_reset(cpu);
thread_cpu = cpu;
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index 1b8c9b618f..dce2c24860 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -78,11 +78,11 @@ static void lan9215_init(uint32_t base, qemu_irq irq)
SysBusDevice *s;
/* This should be a 9215 but the 9118 is close enough */
- dev = qemu_create_nic_device(TYPE_LAN9118, true, NULL);
+ dev = qemu_create_nic_device(qdev_get_machine(), "lan9215", TYPE_LAN9118, true, NULL);
if (dev) {
qdev_prop_set_uint32(dev, "mode_16bit", 1);
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_mmio_map(s, 0, base);
sysbus_connect_irq(s, 0, irq);
}
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index d52f27c51c..4fcb3e5e37 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -640,9 +640,9 @@ static void machine_HP_715_init(MachineState *machine)
}
/* LASI i82596 network */
- dev = qemu_create_nic_device(TYPE_LASI_82596, true, "lasi");
+ dev = qemu_create_nic_device(OBJECT(machine), "lan", TYPE_LASI_82596, true, "lasi");
if (dev) {
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
qdev_get_gpio_in(lasi_dev, LASI_IRQ_LAN_HPA));
memory_region_add_subregion(addr_space,
diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
index f305478b8d..a955efebeb 100644
--- a/hw/m68k/mcf5208.c
+++ b/hw/m68k/mcf5208.c
@@ -260,13 +260,13 @@ static void mcf_fec_init(MemoryRegion *sysmem, hwaddr base, DeviceState *intc)
SysBusDevice *s;
int i;
- dev = qemu_create_nic_device(TYPE_MCF_FEC_NET, true, NULL);
+ dev = qemu_create_nic_device(qdev_get_machine(), "fec", TYPE_MCF_FEC_NET, true, NULL);
if (!dev) {
return;
}
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
for (i = 0; i < FEC_NUM_IRQ; i++) {
sysbus_connect_irq(s, i, qdev_get_gpio_in(intc, i + 36));
}
diff --git a/hw/mips/fuloong2e.c b/hw/mips/fuloong2e.c
index 477ad99c87..1b105ca37c 100644
--- a/hw/mips/fuloong2e.c
+++ b/hw/mips/fuloong2e.c
@@ -231,7 +231,8 @@ static void mips_fuloong2e_init(MachineState *machine)
clock_set_hz(cpuclk, 533080000); /* ~533 MHz */
/* init CPUs */
- cpu = mips_cpu_create_with_clock(machine->cpu_type, cpuclk, false);
+ cpu = mips_cpu_create_with_clock(OBJECT(machine), "cpu[*]",
+ machine->cpu_type, cpuclk, false);
env = &cpu->env;
qemu_register_reset(main_cpu_reset, cpu);
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index 8c52608913..cb24d8c00d 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -209,7 +209,7 @@ static void mips_jazz_init(MachineState *machine,
* ext_clk[jazz_model].pll_mult);
/* init CPUs */
- cpu = mips_cpu_create_with_clock(machine->cpu_type, cpuclk,
+ cpu = mips_cpu_create_with_clock(OBJECT(machine), "cpu[*]", machine->cpu_type, cpuclk,
TARGET_BIG_ENDIAN);
env = &cpu->env;
qemu_register_reset(main_cpu_reset, cpu);
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index 8d8430562c..93c14026ab 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -552,7 +552,8 @@ static void mips_loongson3_virt_init(MachineState *machine)
hwaddr ipi_base = ((hwaddr)node << 44) + virt_memmap[VIRT_IPI].base;
/* init CPUs */
- cpu = mips_cpu_create_with_clock(machine->cpu_type, cpuclk, false);
+ cpu = mips_cpu_create_with_clock(OBJECT(machine), "cpu[*]",
+ machine->cpu_type, cpuclk, false);
/* Init internal devices */
cpu_mips_irq_init_cpu(cpu);
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index e8c130d5bb..72bc97625f 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -1027,7 +1027,7 @@ static void create_cpu_without_cps(MachineState *ms, MaltaState *s,
int i;
for (i = 0; i < ms->smp.cpus; i++) {
- cpu = mips_cpu_create_with_clock(ms->cpu_type, s->cpuclk,
+ cpu = mips_cpu_create_with_clock(OBJECT(ms), "cpu[*]", ms->cpu_type, s->cpuclk,
TARGET_BIG_ENDIAN);
/* Init internal devices */
diff --git a/hw/or1k/or1k-sim.c b/hw/or1k/or1k-sim.c
index 7ea61327c3..293970f156 100644
--- a/hw/or1k/or1k-sim.c
+++ b/hw/or1k/or1k-sim.c
@@ -178,13 +178,13 @@ static void openrisc_sim_net_init(Or1ksimState *state, hwaddr base, hwaddr size,
char *nodename;
int i;
- dev = qemu_create_nic_device("open_eth", true, NULL);
+ dev = qemu_create_nic_device(OBJECT(state), "eth", "open_eth", true, NULL);
if (!dev) {
return;
}
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
if (num_cpus > 1) {
DeviceState *splitter = qdev_new(OBJECT(state), "irq-splitter[*]",
TYPE_SPLIT_IRQ);
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 1848cde0c4..037cb6eb5e 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -237,12 +237,10 @@ static void s390_init_ipl_dev(const char *kernel_filename,
static void s390_create_virtio_net(BusState *bus, const char *name)
{
DeviceState *dev;
- int cnt = 0;
- while ((dev = qemu_create_nic_device(name, true, "virtio"))) {
- g_autofree char *childname = g_strdup_printf("%s[%d]", name, cnt++);
- object_property_add_child(OBJECT(bus), childname, OBJECT(dev));
- qdev_realize_and_unref(dev, bus, &error_fatal);
+ while ((dev = qemu_create_nic_device(qdev_get_machine(), "nic[*]",
+ name, true, "virtio"))) {
+ qdev_realize(dev, bus, &error_fatal);
}
}
diff --git a/hw/vmapple/vmapple.c b/hw/vmapple/vmapple.c
index 60c7dab89b..67e499b74a 100644
--- a/hw/vmapple/vmapple.c
+++ b/hw/vmapple/vmapple.c
@@ -416,8 +416,9 @@ static void create_pcie(VMAppleMachineState *vms)
vms->bus = pci->bus;
g_assert(vms->bus);
- while ((dev = qemu_create_nic_device("virtio-net-pci", true, NULL))) {
- qdev_realize_and_unref(dev, BUS(vms->bus), &error_fatal);
+ while ((dev = qemu_create_nic_device(OBJECT(vms), "nic[*]",
+ "virtio-net-pci", true, NULL))) {
+ qdev_realize(dev, BUS(vms->bus), &error_fatal);
}
if (defaults_enabled()) {
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 10bbc34399..1c48283f5d 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -149,13 +149,13 @@ static void xtfpga_net_init(MemoryRegion *address_space,
SysBusDevice *s;
MemoryRegion *ram;
- dev = qemu_create_nic_device("open_eth", true, NULL);
+ dev = qemu_create_nic_device(qdev_get_machine(), "eth", "open_eth", true, NULL);
if (!dev) {
return;
}
s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
+ sysbus_realize(s, &error_fatal);
sysbus_connect_irq(s, 0, irq);
memory_region_add_subregion(address_space, base,
sysbus_mmio_get_region(s, 0));
diff --git a/include/net/net.h b/include/net/net.h
index 45bc86fc86..3bba6e8c11 100644
--- a/include/net/net.h
+++ b/include/net/net.h
@@ -243,6 +243,8 @@ bool qemu_configure_nic_device(DeviceState *dev, bool match_default,
/**
* qemu_create_nic_device: Create a NIC device if a configuration exists for it
+ * @parent: QOM parent of the created device
+ * @id: child<> property name
* @typename: Object typename of network device
* @match_default: Match NIC configurations with no model specified
* @alias: Additional model string to match
@@ -250,7 +252,8 @@ bool qemu_configure_nic_device(DeviceState *dev, bool match_default,
* Search for a NIC configuration for the provided device type. If found,
* create an object of the corresponding type and return it.
*/
-DeviceState *qemu_create_nic_device(const char *typename, bool match_default,
+DeviceState *qemu_create_nic_device(Object *parent, const char *id,
+ const char *typename, bool match_default,
const char *alias);
/*
diff --git a/linux-user/main.c b/linux-user/main.c
index 53c7768a5e..512335a4c0 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -237,7 +237,8 @@ void init_task_state(TaskState *ts)
CPUArchState *cpu_copy(CPUArchState *env)
{
CPUState *cpu = env_cpu(env);
- CPUState *new_cpu = cpu_create_orphan(cpu_type);
+ CPUState *new_cpu = CPU(object_new(cpu_type));
+ qdev_realize(DEVICE(new_cpu), NULL, &error_fatal);
CPUArchState *new_env = cpu_env(new_cpu);
CPUBreakpoint *bp;
@@ -819,7 +820,8 @@ int main(int argc, char **argv, char **envp)
set_preferred_target_page_bits(ctz32(host_page_size));
finalize_target_page_bits();
- cpu = cpu_create_orphan(cpu_type);
+ cpu = CPU(object_new(cpu_type));
+ qdev_realize(DEVICE(cpu), NULL, &error_fatal);
env = cpu_env(cpu);
cpu_reset(cpu);
thread_cpu = cpu;
diff --git a/migration/migration.c b/migration/migration.c
index bdd163b65d..9736c14458 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -4076,7 +4076,7 @@ static const TypeInfo migration_type = {
.name = TYPE_MIGRATION,
/*
* NOTE: TYPE_MIGRATION is not really a device, as the object is
- * not created using qdev_new_orphan(), it is not attached to the qdev
+ * not created using qdev_new(), it is not attached to the qdev
* device tree, and it is never realized.
*
* TODO: Make this TYPE_OBJECT once QOM provides something like
diff --git a/net/net.c b/net/net.c
index e09f0c0d4f..2224367523 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1204,7 +1204,8 @@ bool qemu_configure_nic_device(DeviceState *dev, bool match_default,
}
/* "Please create a device, if you have a configuration for it" */
-DeviceState *qemu_create_nic_device(const char *typename, bool match_default,
+DeviceState *qemu_create_nic_device(Object *parent, const char *id,
+ const char *typename, bool match_default,
const char *alias)
{
NICInfo *nd = qemu_find_nic_info(typename, match_default, alias);
@@ -1214,7 +1215,7 @@ DeviceState *qemu_create_nic_device(const char *typename, bool match_default,
return NULL;
}
- dev = qdev_new_orphan(typename);
+ dev = qdev_new(parent, id, typename);
qdev_set_nic_properties(dev, nd);
return dev;
}
@@ -1264,9 +1265,10 @@ void qemu_create_nic_bus_devices(BusState *bus, const char *parent_type,
continue;
}
- dev = qdev_new_orphan(model);
+ dev = qdev_new(machine_get_container("peripheral-anon"),
+ "nic[*]", model);
qdev_set_nic_properties(dev, nd);
- qdev_realize_and_unref(dev, bus, &error_fatal);
+ qdev_realize(dev, bus, &error_fatal);
}
g_ptr_array_free(nic_models, true);
diff --git a/target/mips/cpu.c b/target/mips/cpu.c
index 9ad1b4177d..735a2041b7 100644
--- a/target/mips/cpu.c
+++ b/target/mips/cpu.c
@@ -751,12 +751,13 @@ static void mips_cpu_register_types(void)
type_init(mips_cpu_register_types)
/* Could be used by generic CPU object */
-MIPSCPU *mips_cpu_create_with_clock(const char *cpu_type, Clock *cpu_refclk,
+MIPSCPU *mips_cpu_create_with_clock(Object *parent, const char *id,
+ const char *cpu_type, Clock *cpu_refclk,
bool is_big_endian)
{
DeviceState *cpu;
- cpu = qdev_new_orphan(cpu_type);
+ cpu = qdev_new(parent, id, cpu_type);
qdev_connect_clock_in(cpu, "clk-in", cpu_refclk);
object_property_set_bool(OBJECT(cpu), "big-endian", is_big_endian,
&error_abort);
diff --git a/target/mips/cpu.h b/target/mips/cpu.h
index 319147a948..491a190271 100644
--- a/target/mips/cpu.h
+++ b/target/mips/cpu.h
@@ -1429,7 +1429,8 @@ void cpu_mips_restore_fp_status(CPUMIPSState *env);
*
* Returns: A #CPUState or %NULL if an error occurred.
*/
-MIPSCPU *mips_cpu_create_with_clock(const char *cpu_type, Clock *cpu_refclk,
+MIPSCPU *mips_cpu_create_with_clock(Object *parent, const char *id,
+ const char *cpu_type, Clock *cpu_refclk,
bool is_big_endian);
#endif /* MIPS_CPU_H */
diff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c
index 8e888a19d1..7573c1d67b 100644
--- a/target/xtensa/cpu.c
+++ b/target/xtensa/cpu.c
@@ -284,17 +284,6 @@ static void xtensa_cpu_initfn(Object *obj)
#endif
}
-XtensaCPU *xtensa_cpu_create_with_clock(const char *cpu_type, Clock *cpu_refclk)
-{
- DeviceState *cpu;
-
- cpu = qdev_new_orphan(cpu_type);
- qdev_connect_clock_in(cpu, "clk-in", cpu_refclk);
- qdev_realize(cpu, NULL, &error_abort);
-
- return XTENSA_CPU(cpu);
-}
-
#ifndef CONFIG_USER_ONLY
static const VMStateDescription vmstate_xtensa_cpu = {
.name = "cpu",
diff --git a/target/xtensa/cpu.h b/target/xtensa/cpu.h
index 442e98bd1b..019d0b56c1 100644
--- a/target/xtensa/cpu.h
+++ b/target/xtensa/cpu.h
@@ -736,8 +736,6 @@ static inline uint32_t xtensa_replicate_windowstart(CPUXtensaState *env)
#define XTENSA_CSBASE_LBEG_OFF_MASK 0x00ff0000
#define XTENSA_CSBASE_LBEG_OFF_SHIFT 16
-XtensaCPU *xtensa_cpu_create_with_clock(const char *cpu_type,
- Clock *cpu_refclk);
/*
* Set the NaN propagation rule for future FPU operations:
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 083/134] usb, ssi, i2c: Remove *_orphan() creator variants
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (81 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 082/134] net, target/mips: Give -nic and CPU-with-clock helpers " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 084/134] isa: " Alexander Graf
` (51 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
All external callers now go through the parented usb_new()/
usb_create_simple(), ssi_create_peripheral(), i2c_slave_new()/
i2c_slave_create_simple() introduced earlier in the series.
Remove the transitional *_orphan() spellings.
The corresponding *_realize_and_unref() helpers stay for now: they
are still valid for callers that reach for object_new() directly
and hold a floating reference (qdev_device_add() being the primary
example one layer down).
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/i2c/core.c | 18 ------------------
hw/ssi/ssi.c | 8 --------
include/hw/i2c/i2c.h | 31 ++++---------------------------
include/hw/ssi/ssi.h | 5 ++---
include/hw/usb/usb.h | 9 ---------
5 files changed, 6 insertions(+), 65 deletions(-)
diff --git a/hw/i2c/core.c b/hw/i2c/core.c
index fba21fdfad..f333df3760 100644
--- a/hw/i2c/core.c
+++ b/hw/i2c/core.c
@@ -364,15 +364,6 @@ const VMStateDescription vmstate_i2c_slave = {
}
};
-I2CSlave *i2c_slave_new_orphan(const char *name, uint8_t addr)
-{
- DeviceState *dev;
-
- dev = qdev_new_orphan(name);
- qdev_prop_set_uint8(dev, "address", addr);
- return I2C_SLAVE(dev);
-}
-
I2CSlave *i2c_slave_new(Object *parent, const char *id,
const char *type, uint8_t addr)
{
@@ -398,15 +389,6 @@ bool i2c_slave_realize_and_unref(I2CSlave *dev, I2CBus *bus, Error **errp)
return qdev_realize_and_unref(&dev->qdev, &bus->qbus, errp);
}
-I2CSlave *i2c_slave_create_simple_orphan(I2CBus *bus, const char *name, uint8_t addr)
-{
- I2CSlave *dev = i2c_slave_new_orphan(name, addr);
-
- i2c_slave_realize_and_unref(dev, bus, &error_abort);
-
- return dev;
-}
-
static bool i2c_slave_match(I2CSlave *candidate, uint8_t address,
bool broadcast, I2CNodeList *current_devs)
{
diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
index 6031cde7b0..07188d87bb 100644
--- a/hw/ssi/ssi.c
+++ b/hw/ssi/ssi.c
@@ -147,14 +147,6 @@ DeviceState *ssi_create_peripheral(Object *parent, const char *id,
return dev;
}
-DeviceState *ssi_create_peripheral_orphan(SSIBus *bus, const char *name)
-{
- DeviceState *dev = qdev_new_orphan(name);
-
- ssi_realize_and_unref(dev, bus, &error_fatal);
- return dev;
-}
-
SSIBus *ssi_create_bus(DeviceState *parent, const char *name)
{
BusState *bus;
diff --git a/include/hw/i2c/i2c.h b/include/hw/i2c/i2c.h
index 0bba1a7c20..c0829edf8f 100644
--- a/include/hw/i2c/i2c.h
+++ b/include/hw/i2c/i2c.h
@@ -154,17 +154,6 @@ uint8_t i2c_recv(I2CBus *bus);
bool i2c_scan_bus(I2CBus *bus, uint8_t address, bool broadcast,
I2CNodeList *current_devs);
-/**
- * Create an I2C slave device on the heap.
- * @name: a device type name
- * @addr: I2C address of the slave when put on a bus
- *
- * This only initializes the device state structure and allows
- * properties to be set. Type @name must exist. The device still
- * needs to be realized. See qdev-core.h.
- */
-I2CSlave *i2c_slave_new_orphan(const char *name, uint8_t addr);
-
/**
* Create a parented I2C slave device on the heap.
* @parent: the QOM parent
@@ -172,24 +161,12 @@ I2CSlave *i2c_slave_new_orphan(const char *name, uint8_t addr);
* @type: I2C slave device type name
* @addr: I2C address of the slave when put on a bus
*
- * Like i2c_slave_new_orphan(), but the returned device is owned by
+ * Like i2c_slave_new(), but the returned device is owned by
* @parent's child<> property. Pair with qdev_realize().
*/
I2CSlave *i2c_slave_new(Object *parent, const char *id,
const char *type, uint8_t addr);
-/**
- * Create and realize an I2C slave device on the heap.
- * @bus: I2C bus to put it on
- * @name: I2C slave device type name
- * @addr: I2C address of the slave when put on a bus
- *
- * Create the device state structure, initialize it, put it on the
- * specified @bus, and drop the reference to it (the device is realized).
- */
-I2CSlave *i2c_slave_create_simple_orphan(I2CBus *bus, const char *name,
- uint8_t addr);
-
/**
* Create, parent and realize an I2C slave device on the heap.
* @parent: the QOM parent
@@ -218,11 +195,11 @@ I2CSlave *i2c_slave_create_simple(Object *parent, const char *id,
* Call 'realize' on @dev, put it on the specified @bus, and drop the
* reference to it.
*
- * This function is useful if you have created @dev via qdev_new_orphan(),
- * i2c_slave_new_orphan() or i2c_slave_try_new() (which take a reference to
+ * This function is useful if you have created @dev via qdev_new(),
+ * i2c_slave_new() or i2c_slave_try_new() (which take a reference to
* the device it returns to you), so that you can set properties on it
* before realizing it. If you don't need to set properties then
- * i2c_slave_create_simple_orphan() is probably better (as it does the create,
+ * i2c_slave_create_simple() is probably better (as it does the create,
* init and realize in one step).
*
* If you are embedding the I2C slave into another QOM device and
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
index 36ed002281..b2a264bb55 100644
--- a/include/hw/ssi/ssi.h
+++ b/include/hw/ssi/ssi.h
@@ -83,7 +83,6 @@ extern const VMStateDescription vmstate_ssi_peripheral;
DeviceState *ssi_create_peripheral(Object *parent, const char *id,
SSIBus *bus, const char *type);
-DeviceState *ssi_create_peripheral_orphan(SSIBus *bus, const char *name);
/**
* ssi_realize_and_unref: realize and unref an SSI peripheral
* @dev: SSI peripheral to realize
@@ -94,10 +93,10 @@ DeviceState *ssi_create_peripheral_orphan(SSIBus *bus, const char *name);
* reference to it. Errors are reported via @errp and by returning
* false.
*
- * This function is useful if you have created @dev via qdev_new_orphan()
+ * This function is useful if you have created @dev via qdev_new()
* (which takes a reference to the device it returns to you), so that
* you can set properties on it before realizing it. If you don't need
- * to set properties then ssi_create_peripheral_orphan() is probably better (as it
+ * to set properties then ssi_create_peripheral() is probably better (as it
* does the create, init and realize in one step).
*
* If you are embedding the SSI peripheral into another QOM device and
diff --git a/include/hw/usb/usb.h b/include/hw/usb/usb.h
index 1ae1f40aa9..d2e59bc83b 100644
--- a/include/hw/usb/usb.h
+++ b/include/hw/usb/usb.h
@@ -599,13 +599,4 @@ static inline USBDevice *usb_create_simple(Object *parent, const char *id,
return dev;
}
-static inline USBDevice *usb_create_simple_orphan(USBBus *bus,
- const char *name)
-{
- USBDevice *dev = USB_DEVICE(qdev_new_orphan(name));
-
- usb_realize_and_unref(dev, bus, &error_abort);
- return dev;
-}
-
#endif
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 084/134] isa: Remove *_orphan() creator variants
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (82 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 083/134] usb, ssi, i2c: Remove *_orphan() creator variants Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-13 8:35 ` Philippe Mathieu-Daudé
2026-07-11 22:36 ` [RFC PATCH 085/134] pci: " Alexander Graf
` (50 subsequent siblings)
134 siblings, 1 reply; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
All boards create their ISA devices with an explicit QOM parent
now. Drop isa_new_orphan(), isa_try_new_orphan() and
isa_create_simple_orphan().
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/isa/isa-bus.c | 19 -------------------
include/hw/isa/isa.h | 3 ---
2 files changed, 22 deletions(-)
diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c
index 7a6a595ce7..22452e5048 100644
--- a/hw/isa/isa-bus.c
+++ b/hw/isa/isa-bus.c
@@ -172,25 +172,6 @@ ISADevice *isa_create_simple(Object *parent, const char *id,
return dev;
}
-ISADevice *isa_new_orphan(const char *name)
-{
- return ISA_DEVICE(qdev_new_orphan(name));
-}
-
-ISADevice *isa_try_new_orphan(const char *name)
-{
- return ISA_DEVICE(qdev_try_new_orphan(name));
-}
-
-ISADevice *isa_create_simple_orphan(ISABus *bus, const char *name)
-{
- ISADevice *dev;
-
- dev = isa_new_orphan(name);
- isa_realize_and_unref(dev, bus, &error_fatal);
- return dev;
-}
-
bool isa_realize_and_unref(ISADevice *dev, ISABus *bus, Error **errp)
{
return qdev_realize_and_unref(&dev->parent_obj, &bus->parent_obj, errp);
diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h
index 79bfe16361..9bbaa3c258 100644
--- a/include/hw/isa/isa.h
+++ b/include/hw/isa/isa.h
@@ -86,10 +86,7 @@ ISADevice *isa_new(Object *parent, const char *id, const char *type);
ISADevice *isa_try_new(Object *parent, const char *id, const char *type);
ISADevice *isa_create_simple(Object *parent, const char *id,
ISABus *bus, const char *type);
-ISADevice *isa_new_orphan(const char *name);
-ISADevice *isa_try_new_orphan(const char *name);
bool isa_realize_and_unref(ISADevice *dev, ISABus *bus, Error **errp);
-ISADevice *isa_create_simple_orphan(ISABus *bus, const char *name);
ISADevice *isa_vga_init(Object *parent, ISABus *bus);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 084/134] isa: Remove *_orphan() creator variants
2026-07-11 22:36 ` [RFC PATCH 084/134] isa: " Alexander Graf
@ 2026-07-13 8:35 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 156+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-07-13 8:35 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
On 12/7/26 00:36, Alexander Graf wrote:
> All boards create their ISA devices with an explicit QOM parent
> now. Drop isa_new_orphan(), isa_try_new_orphan() and
> isa_create_simple_orphan().
>
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> hw/isa/isa-bus.c | 19 -------------------
> include/hw/isa/isa.h | 3 ---
> 2 files changed, 22 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 085/134] pci: Remove *_orphan() creator variants
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (83 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 084/134] isa: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-13 8:36 ` Philippe Mathieu-Daudé
2026-07-11 22:36 ` [RFC PATCH 086/134] cpu: Remove cpu_create_orphan() Alexander Graf
` (49 subsequent siblings)
134 siblings, 1 reply; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
All boards create their PCI devices with an explicit QOM parent
now. Drop pci_new_orphan(), pci_new_multifunction_orphan(),
pci_create_simple_orphan(), pci_create_simple_multifunction_orphan()
and the internal pci_new_internal() they wrapped.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/pci/pci.c | 35 -----------------------------------
include/hw/pci/pci.h | 5 -----
2 files changed, 40 deletions(-)
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index ca5882ba59..5ef9dfa8b7 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -2388,16 +2388,6 @@ static void pci_qdev_realize(DeviceState *qdev, Error **errp)
pci_dev->msi_trigger = pci_msi_trigger;
}
-static PCIDevice *pci_new_internal(int devfn, bool multifunction,
- const char *name)
-{
- DeviceState *dev;
-
- dev = qdev_new_orphan(name);
- qdev_prop_set_int32(dev, "addr", devfn);
- qdev_prop_set_bit(dev, "multifunction", multifunction);
- return PCI_DEVICE(dev);
-}
static PCIDevice *pci_new_child_internal(Object *parent, const char *id,
int devfn, bool multifunction,
@@ -2440,36 +2430,11 @@ PCIDevice *pci_create_simple(Object *parent, const char *id,
return dev;
}
-PCIDevice *pci_new_multifunction_orphan(int devfn, const char *name)
-{
- return pci_new_internal(devfn, true, name);
-}
-
-PCIDevice *pci_new_orphan(int devfn, const char *name)
-{
- return pci_new_internal(devfn, false, name);
-}
-
bool pci_realize_and_unref(PCIDevice *dev, PCIBus *bus, Error **errp)
{
return qdev_realize_and_unref(&dev->qdev, &bus->qbus, errp);
}
-PCIDevice *pci_create_simple_multifunction_orphan(PCIBus *bus, int devfn,
- const char *name)
-{
- PCIDevice *dev = pci_new_multifunction_orphan(devfn, name);
- pci_realize_and_unref(dev, bus, &error_fatal);
- return dev;
-}
-
-PCIDevice *pci_create_simple_orphan(PCIBus *bus, int devfn, const char *name)
-{
- PCIDevice *dev = pci_new_orphan(devfn, name);
- pci_realize_and_unref(dev, bus, &error_fatal);
- return dev;
-}
-
static uint8_t pci_find_space(PCIDevice *pdev, uint8_t size)
{
int offset = PCI_CONFIG_HEADER_SIZE;
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index 9c6bcc0b96..d6191fc529 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -1098,13 +1098,8 @@ PCIDevice *pci_create_simple_multifunction(Object *parent, const char *id,
PCIDevice *pci_create_simple(Object *parent, const char *id,
PCIBus *bus, int devfn, const char *type);
-PCIDevice *pci_new_multifunction_orphan(int devfn, const char *name);
-PCIDevice *pci_new_orphan(int devfn, const char *name);
bool pci_realize_and_unref(PCIDevice *dev, PCIBus *bus, Error **errp);
-PCIDevice *pci_create_simple_multifunction_orphan(PCIBus *bus, int devfn,
- const char *name);
-PCIDevice *pci_create_simple_orphan(PCIBus *bus, int devfn, const char *name);
void lsi53c8xx_handle_legacy_cmdline(DeviceState *lsi_dev);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 085/134] pci: Remove *_orphan() creator variants
2026-07-11 22:36 ` [RFC PATCH 085/134] pci: " Alexander Graf
@ 2026-07-13 8:36 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 156+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-07-13 8:36 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
On 12/7/26 00:36, Alexander Graf wrote:
> All boards create their PCI devices with an explicit QOM parent
> now. Drop pci_new_orphan(), pci_new_multifunction_orphan(),
> pci_create_simple_orphan(), pci_create_simple_multifunction_orphan()
> and the internal pci_new_internal() they wrapped.
>
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> hw/pci/pci.c | 35 -----------------------------------
> include/hw/pci/pci.h | 5 -----
> 2 files changed, 40 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 086/134] cpu: Remove cpu_create_orphan()
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (84 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 085/134] pci: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 087/134] sysbus: Remove *_orphan() creator variants Alexander Graf
` (48 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
All targets create their CPUs with an explicit parent now.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/core/cpu-common.c | 12 ------------
include/hw/core/cpu.h | 10 ----------
2 files changed, 22 deletions(-)
diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
index eef243c1ad..829a044e9e 100644
--- a/hw/core/cpu-common.c
+++ b/hw/core/cpu-common.c
@@ -68,18 +68,6 @@ CPUState *cpu_create(Object *parent, const char *id, const char *typename)
return cpu;
}
-CPUState *cpu_create_orphan(const char *typename)
-{
- Error *err = NULL;
- CPUState *cpu = CPU(object_new(typename));
- if (!qdev_realize(DEVICE(cpu), NULL, &err)) {
- error_report_err(err);
- object_unref(OBJECT(cpu));
- exit(EXIT_FAILURE);
- }
- return cpu;
-}
-
void cpu_reset_interrupt(CPUState *cpu, int mask)
{
qatomic_and(&cpu->interrupt_request, ~mask);
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index 1b2ec1ab1e..544740a699 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -857,16 +857,6 @@ char *cpu_model_from_type(const char *typename);
*/
CPUState *cpu_create(Object *parent, const char *id, const char *typename);
-/**
- * cpu_create_orphan:
- * @typename: The CPU type.
- *
- * Instantiates a CPU and realizes the CPU.
- *
- * Returns: A #CPUState or %NULL if an error occurred.
- */
-CPUState *cpu_create_orphan(const char *typename);
-
/**
* parse_cpu_option:
* @cpu_option: The -cpu option including optional parameters.
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 087/134] sysbus: Remove *_orphan() creator variants
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (85 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 086/134] cpu: Remove cpu_create_orphan() Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-13 8:36 ` Philippe Mathieu-Daudé
2026-07-11 22:36 ` [RFC PATCH 088/134] qdev: Remove qdev_new_orphan() and qdev_try_new_orphan() Alexander Graf
` (47 subsequent siblings)
134 siblings, 1 reply; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
All boards create sysbus devices with an explicit parent now.
Drop sysbus_create_simple_orphan() and
sysbus_create_varargs_orphan().
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/core/sysbus.c | 29 -----------------------------
include/hw/core/sysbus.h | 11 -----------
2 files changed, 40 deletions(-)
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index bbacb07e1a..2974616285 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -242,35 +242,6 @@ DeviceState *sysbus_create_varargs(Object *parent, const char *id,
return dev;
}
-DeviceState *sysbus_create_varargs_orphan(const char *name,
- hwaddr addr, ...)
-{
- DeviceState *dev;
- SysBusDevice *s;
- va_list va;
- qemu_irq irq;
- int n;
-
- dev = qdev_new_orphan(name);
- s = SYS_BUS_DEVICE(dev);
- sysbus_realize_and_unref(s, &error_fatal);
- if (addr != (hwaddr)-1) {
- sysbus_mmio_map(s, 0, addr);
- }
- va_start(va, addr);
- n = 0;
- while (1) {
- irq = va_arg(va, qemu_irq);
- if (!irq) {
- break;
- }
- sysbus_connect_irq(s, n, irq);
- n++;
- }
- va_end(va);
- return dev;
-}
-
bool sysbus_realize(SysBusDevice *dev, Error **errp)
{
return qdev_realize(DEVICE(dev), sysbus_get_default(), errp);
diff --git a/include/hw/core/sysbus.h b/include/hw/core/sysbus.h
index 7737c959c5..d3f4332b3c 100644
--- a/include/hw/core/sysbus.h
+++ b/include/hw/core/sysbus.h
@@ -115,15 +115,4 @@ static inline DeviceState *sysbus_create_simple(Object *parent,
return sysbus_create_varargs(parent, id, type, addr, irq, NULL);
}
-/* Legacy helper function for creating unparented devices. */
-DeviceState *sysbus_create_varargs_orphan(const char *name,
- hwaddr addr, ...);
-
-static inline DeviceState *sysbus_create_simple_orphan(const char *name,
- hwaddr addr,
- qemu_irq irq)
-{
- return sysbus_create_varargs_orphan(name, addr, irq, NULL);
-}
-
#endif /* HW_SYSBUS_H */
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 087/134] sysbus: Remove *_orphan() creator variants
2026-07-11 22:36 ` [RFC PATCH 087/134] sysbus: Remove *_orphan() creator variants Alexander Graf
@ 2026-07-13 8:36 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 156+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-07-13 8:36 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
On 12/7/26 00:36, Alexander Graf wrote:
> All boards create sysbus devices with an explicit parent now.
> Drop sysbus_create_simple_orphan() and
> sysbus_create_varargs_orphan().
>
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> hw/core/sysbus.c | 29 -----------------------------
> include/hw/core/sysbus.h | 11 -----------
> 2 files changed, 40 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 088/134] qdev: Remove qdev_new_orphan() and qdev_try_new_orphan()
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (86 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 087/134] sysbus: Remove *_orphan() creator variants Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 089/134] memory: Accept non-device owners in memory_region_init_ram() Alexander Graf
` (46 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Every bus-layer *_orphan() wrapper is gone and the last direct
caller, qdev_device_add_from_qdict(), now uses object_new() plus
qdev_set_id() to place -device instances under
/machine/peripheral{,-anon} as before. There is no remaining
legitimate way to create a device without picking its parent, so
drop the transitional *_orphan() spellings and update the doc
comments that still referenced them.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/core/qdev.c | 13 -------------
include/hw/core/qdev.h | 30 +++---------------------------
system/qdev-monitor.c | 2 +-
3 files changed, 4 insertions(+), 41 deletions(-)
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index d2c89d0310..f7b512eb35 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -164,19 +164,6 @@ DeviceState *qdev_try_new(Object *parent, const char *id, const char *type)
return DEVICE(obj);
}
-DeviceState *qdev_new_orphan(const char *name)
-{
- return DEVICE(object_new(name));
-}
-
-DeviceState *qdev_try_new_orphan(const char *name)
-{
- ObjectClass *oc = module_object_class_by_name(name);
- if (!oc) {
- return NULL;
- }
- return DEVICE(object_new_with_class(oc));
-}
static QTAILQ_HEAD(, DeviceListener) device_listeners
= QTAILQ_HEAD_INITIALIZER(device_listeners);
diff --git a/include/hw/core/qdev.h b/include/hw/core/qdev.h
index e692a1d48e..9220e9e3b1 100644
--- a/include/hw/core/qdev.h
+++ b/include/hw/core/qdev.h
@@ -440,30 +440,6 @@ DeviceState *qdev_new(Object *parent, const char *id, const char *type);
*/
DeviceState *qdev_try_new(Object *parent, const char *id, const char *type);
-/**
- * qdev_new_orphan: Create a device on the heap
- * @name: device type to create (we assert() that this type exists)
- *
- * This only allocates the memory and initializes the device state
- * structure, ready for the caller to set properties if they wish.
- * The device still needs to be realized.
- *
- * Return: a derived DeviceState object with a reference count of 1.
- */
-DeviceState *qdev_new_orphan(const char *name);
-
-/**
- * qdev_try_new_orphan: Try to create a device on the heap
- * @name: device type to create
- *
- * This is like qdev_new_orphan(), except it returns %NULL when type @name
- * does not exist, rather than asserting.
- *
- * Return: a derived DeviceState object with a reference count of 1 or
- * NULL if type @name does not exist.
- */
-DeviceState *qdev_try_new_orphan(const char *name);
-
/**
* qdev_is_realized() - check if device is realized
* @dev: The device to check.
@@ -488,8 +464,8 @@ static inline bool qdev_is_realized(DeviceState *dev)
* If @bus, plug @dev into @bus. This takes a reference to @dev.
* If @dev has no QOM parent, make one up, taking another reference.
*
- * If you created @dev using qdev_new_orphan(), you probably want to use
- * qdev_realize_and_unref() instead.
+ * If you created @dev via object_new() directly (holding a floating
+ * reference), you probably want to use qdev_realize_and_unref() instead.
*
* Return: true on success, else false setting @errp with error
*/
@@ -506,7 +482,7 @@ bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp);
* (private) reference, which is dropped on return regardless of
* success or failure. Intended use::
*
- * dev = qdev_new_orphan();
+ * dev = DEVICE(object_new(TYPE_FOO));
* [...]
* qdev_realize_and_unref(dev, bus, errp);
*
diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
index adc37d6a89..0e13b1540c 100644
--- a/system/qdev-monitor.c
+++ b/system/qdev-monitor.c
@@ -707,7 +707,7 @@ DeviceState *qdev_device_add_from_qdict(const QDict *opts,
}
/* create device */
- dev = qdev_new_orphan(driver);
+ dev = DEVICE(object_new(driver));
/* Check whether the hotplug is allowed by the machine */
if (phase_check(PHASE_MACHINE_READY) &&
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 089/134] memory: Accept non-device owners in memory_region_init_ram()
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (87 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 088/134] qdev: Remove qdev_new_orphan() and qdev_try_new_orphan() Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 090/134] hw/misc-boards: Give memory regions an explicit owner Alexander Graf
` (45 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
memory_region_register_ram() casts the owner to DeviceState with an
asserting DEVICE() check. Historically this was fine because every
caller either passed a device or NULL, but the following patches
give board-created RAM regions their machine as owner, which is not
a device.
vmstate_register_ram() only uses the device to prefix the RAMBlock
idstr with the device's canonical path. Use object_dynamic_cast()
so non-device owners degrade to the same NULL-owner idstr they had
before, and drop the stale TODO comment.
No functional change for existing callers.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
system/memory.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/system/memory.c b/system/memory.c
index 5fc36708ec..e3ee0416cc 100644
--- a/system/memory.c
+++ b/system/memory.c
@@ -3631,15 +3631,15 @@ void mtree_info(bool flatview, bool dispatch_tree, bool owner, bool disabled)
static void memory_region_register_ram(MemoryRegion *mr, Object *owner)
{
- DeviceState *owner_dev;
-
- /* This will assert if owner is neither NULL nor a DeviceState.
- * We only want the owner here for the purposes of defining a
- * unique name for migration. TODO: Ideally we should implement
- * a naming scheme for Objects which are not DeviceStates, in
- * which case we can relax this restriction.
+ /*
+ * vmstate_register_ram() prefixes the RAMBlock idstr with the
+ * canonical path of @owner when it is a DeviceState. Board-
+ * created RAM regions are owned by the machine, which is not a
+ * device; pass NULL there so the idstr is the bare region name,
+ * matching historical behaviour for owner==NULL callers.
*/
- owner_dev = DEVICE(owner);
+ DeviceState *owner_dev =
+ (DeviceState *)object_dynamic_cast(owner, TYPE_DEVICE);
vmstate_register_ram(mr, owner_dev);
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 090/134] hw/misc-boards: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (88 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 089/134] memory: Accept non-device owners in memory_region_init_ram() Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 091/134] hw/mips: " Alexander Graf
` (44 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
memory_region_init*() takes an @owner argument that becomes the
QOM parent of the MemoryRegion object. When NULL is passed the
region is silently reparented under /machine/unattached, hiding
its lifetime owner.
Convert trivial owner==NULL sites in board init functions and
device realize functions across small subdirectories. The owner
is the enclosing machine or device in every case:
hw/hexagon OBJECT(machine|ms|vms) virt, hexagon_dsp
hw/hppa parent, OBJECT(machine)
hw/ipmi OBJECT(ii) IPMIInterface implementations
hw/loongarch OBJECT(machine)
hw/microblaze OBJECT(machine)
hw/or1k OBJECT(machine)
hw/pci-host OBJECT(dev) bonito realize
hw/rtc OBJECT(dev) ls7a realize
hw/sparc OBJECT(machine)
hw/sparc64 OBJECT(machine)
hw/vmapple OBJECT(vms)
hw/xen OBJECT(s) xen-pvh-common ram init
No functional change: memory_region_do_init() would have parented
these under /machine/unattached; they now sit under their creator.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/hexagon/hexagon_dsp.c | 4 ++--
hw/hexagon/virt.c | 8 ++++----
hw/hppa/machine.c | 6 +++---
hw/ipmi/ipmi_bt.c | 2 +-
hw/ipmi/ipmi_kcs.c | 2 +-
hw/loongarch/virt.c | 4 ++--
hw/microblaze/petalogix_ml605_mmu.c | 4 ++--
hw/microblaze/petalogix_s3adsp1800_mmu.c | 4 ++--
hw/microblaze/xlnx-zynqmp-pmu.c | 4 ++--
hw/or1k/or1k-sim.c | 2 +-
hw/or1k/virt.c | 2 +-
hw/pci-host/bonito.c | 4 ++--
hw/rtc/ls7a_rtc.c | 2 +-
hw/sparc/leon3.c | 2 +-
hw/sparc64/niagara.c | 13 +++++++------
hw/vmapple/vmapple.c | 2 +-
hw/xen/xen-pvh-common.c | 12 ++++++------
17 files changed, 39 insertions(+), 38 deletions(-)
diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c
index ccd9a06f51..53dfe6741e 100644
--- a/hw/hexagon/hexagon_dsp.c
+++ b/hw/hexagon/hexagon_dsp.c
@@ -122,12 +122,12 @@ static void hexagon_common_init(MachineState *machine, Rev_t rev,
address_space = get_system_memory();
- memory_region_init_rom(&hms->cfgtable_rom, NULL, "config_table.rom",
+ memory_region_init_rom(&hms->cfgtable_rom, OBJECT(machine), "config_table.rom",
sizeof(m_cfg->cfgtable), &error_fatal);
memory_region_add_subregion(address_space, m_cfg->cfgbase,
&hms->cfgtable_rom);
- memory_region_init_ram(&hms->ram, NULL, "ddr.ram",
+ memory_region_init_ram(&hms->ram, OBJECT(machine), "ddr.ram",
machine->ram_size, &error_fatal);
memory_region_add_subregion(address_space, 0x0, &hms->ram);
diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c
index 0619f06c41..fb23cda19f 100644
--- a/hw/hexagon/virt.c
+++ b/hw/hexagon/virt.c
@@ -74,7 +74,7 @@ static void fdt_add_hvx(HexagonVirtMachineState *vms,
const MachineState *ms = MACHINE(vms);
uint32_t vtcm_size_bytes = m_cfg->cfgtable.vtcm_size_kb * 1024;
if (vtcm_size_bytes > 0) {
- memory_region_init_ram(&vms->vtcm, NULL, "vtcm.ram", vtcm_size_bytes,
+ memory_region_init_ram(&vms->vtcm, OBJECT(vms), "vtcm.ram", vtcm_size_bytes,
&error_fatal);
memory_region_add_subregion(vms->sys, m_cfg->cfgtable.vtcm_base << 16,
&vms->vtcm);
@@ -250,18 +250,18 @@ static void virt_init(MachineState *ms)
vms->apb_clk = clock_new(OBJECT(ms), "apb-pclk");
clock_set_hz(vms->apb_clk, 24000000);
- memory_region_init_ram(&vms->parent_obj.ram, NULL, "ddr.ram",
+ memory_region_init_ram(&vms->parent_obj.ram, OBJECT(ms), "ddr.ram",
ms->ram_size, &error_fatal);
memory_region_add_subregion(vms->sys, 0x0, &vms->parent_obj.ram);
if (m_cfg->l2tcm_size) {
- memory_region_init_ram(&vms->tcm, NULL, "tcm.ram", m_cfg->l2tcm_size,
+ memory_region_init_ram(&vms->tcm, OBJECT(ms), "tcm.ram", m_cfg->l2tcm_size,
&error_fatal);
memory_region_add_subregion(vms->sys, m_cfg->cfgtable.l2tcm_base << 16,
&vms->tcm);
}
- memory_region_init_rom(&vms->parent_obj.cfgtable_rom, NULL,
+ memory_region_init_rom(&vms->parent_obj.cfgtable_rom, OBJECT(ms),
"config_table.rom", sizeof(m_cfg->cfgtable),
&error_fatal);
memory_region_add_subregion(vms->sys, m_cfg->cfgbase,
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 4fcb3e5e37..233cf6318b 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -104,7 +104,7 @@ static ISABus *hppa_isa_bus(Object *parent, hwaddr addr)
MemoryRegion *isa_region;
isa_region = g_new(MemoryRegion, 1);
- memory_region_init_io(isa_region, NULL, &hppa_pci_ignore_ops,
+ memory_region_init_io(isa_region, parent, &hppa_pci_ignore_ops,
NULL, "isa-io", 0x800);
memory_region_add_subregion(get_system_memory(), addr, isa_region);
@@ -337,7 +337,7 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine)
*/
cflush_name = g_strdup_printf("cpu%u-T600-cacheflush", i);
cflush = g_new(MemoryRegion, 1);
- memory_region_init_io(cflush, NULL, &hppa_pci_ignore_ops,
+ memory_region_init_io(cflush, OBJECT(machine), &hppa_pci_ignore_ops,
NULL, cflush_name, 4);
memory_region_add_subregion(addr_space,
translate(NULL, CPU_HPA + i * 0x1000 + 0x500),
@@ -498,7 +498,7 @@ static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
}
rom_region = g_new(MemoryRegion, 1);
- memory_region_init_ram(rom_region, NULL, "firmware",
+ memory_region_init_ram(rom_region, OBJECT(machine), "firmware",
(FIRMWARE_END - FIRMWARE_START), &error_fatal);
memory_region_add_subregion(addr_space,
translate(NULL, FIRMWARE_START), rom_region);
diff --git a/hw/ipmi/ipmi_bt.c b/hw/ipmi/ipmi_bt.c
index e01d02fe52..173e2e52c6 100644
--- a/hw/ipmi/ipmi_bt.c
+++ b/hw/ipmi/ipmi_bt.c
@@ -361,7 +361,7 @@ static void ipmi_bt_init(IPMIInterface *ii, unsigned int min_size, Error **errp)
ib->size_mask = min_size - 1;
ib->io_length = 3;
- memory_region_init_io(&ib->io, NULL, &ipmi_bt_io_ops, ii, "ipmi-bt",
+ memory_region_init_io(&ib->io, OBJECT(ii), &ipmi_bt_io_ops, ii, "ipmi-bt",
min_size);
}
diff --git a/hw/ipmi/ipmi_kcs.c b/hw/ipmi/ipmi_kcs.c
index d5cfe6c068..9bd678e725 100644
--- a/hw/ipmi/ipmi_kcs.c
+++ b/hw/ipmi/ipmi_kcs.c
@@ -339,7 +339,7 @@ static void ipmi_kcs_init(IPMIInterface *ii, unsigned int min_size,
}
ik->size_mask = min_size - 1;
ik->io_length = 2;
- memory_region_init_io(&ik->io, NULL, &ipmi_kcs_io_ops, ii, "ipmi-kcs",
+ memory_region_init_io(&ik->io, OBJECT(ii), &ipmi_kcs_io_ops, ii, "ipmi-kcs",
min_size);
}
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 8c6d2ad122..580ef0bb3e 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -966,13 +966,13 @@ static void virt_init(MachineState *machine)
size = VIRT_LOWMEM_SIZE;
}
- memory_region_init_alias(&lvms->lowmem, NULL, "loongarch.lowram",
+ memory_region_init_alias(&lvms->lowmem, OBJECT(machine), "loongarch.lowram",
machine->ram, base, size);
memory_region_add_subregion(address_space_mem, base, &lvms->lowmem);
base += size;
if (ram_size - size) {
base = VIRT_HIGHMEM_BASE;
- memory_region_init_alias(&lvms->highmem, NULL, "loongarch.highram",
+ memory_region_init_alias(&lvms->highmem, OBJECT(machine), "loongarch.highram",
machine->ram, VIRT_LOWMEM_BASE + size, ram_size - size);
memory_region_add_subregion(address_space_mem, base, &lvms->highmem);
base += ram_size - size;
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index 1dc34dc247..26470b0251 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -94,11 +94,11 @@ petalogix_ml605_init(MachineState *machine)
qdev_realize(DEVICE(cpu), NULL, &error_abort);
/* Attach emulated BRAM through the LMB. */
- memory_region_init_ram(phys_lmb_bram, NULL, "petalogix_ml605.lmb_bram",
+ memory_region_init_ram(phys_lmb_bram, OBJECT(machine), "petalogix_ml605.lmb_bram",
LMB_BRAM_SIZE, &error_fatal);
memory_region_add_subregion(address_space_mem, 0x00000000, phys_lmb_bram);
- memory_region_init_ram(phys_ram, NULL, "petalogix_ml605.ram", ram_size,
+ memory_region_init_ram(phys_ram, OBJECT(machine), "petalogix_ml605.ram", ram_size,
&error_fatal);
memory_region_add_subregion(address_space_mem, MEMORY_BASEADDR, phys_ram);
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index 6986eb7732..83bf325b2b 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -92,12 +92,12 @@ petalogix_s3adsp1800_init(MachineState *machine)
qdev_realize(DEVICE(cpu), NULL, &error_abort);
/* Attach emulated BRAM through the LMB. */
- memory_region_init_ram(phys_lmb_bram, NULL,
+ memory_region_init_ram(phys_lmb_bram, OBJECT(machine),
"petalogix_s3adsp1800.lmb_bram", LMB_BRAM_SIZE,
&error_fatal);
memory_region_add_subregion(sysmem, 0x00000000, phys_lmb_bram);
- memory_region_init_ram(phys_ram, NULL, "petalogix_s3adsp1800.ram",
+ memory_region_init_ram(phys_ram, OBJECT(machine), "petalogix_s3adsp1800.ram",
ram_size, &error_fatal);
memory_region_add_subregion(sysmem, ddr_base, phys_ram);
diff --git a/hw/microblaze/xlnx-zynqmp-pmu.c b/hw/microblaze/xlnx-zynqmp-pmu.c
index 00154236bf..cf9314f86c 100644
--- a/hw/microblaze/xlnx-zynqmp-pmu.c
+++ b/hw/microblaze/xlnx-zynqmp-pmu.c
@@ -155,13 +155,13 @@ static void xlnx_zynqmp_pmu_init(MachineState *machine)
MemoryRegion *pmu_ram = g_new(MemoryRegion, 1);
/* Create the ROM */
- memory_region_init_rom(pmu_rom, NULL, "xlnx-zynqmp-pmu.rom",
+ memory_region_init_rom(pmu_rom, OBJECT(machine), "xlnx-zynqmp-pmu.rom",
XLNX_ZYNQMP_PMU_ROM_SIZE, &error_fatal);
memory_region_add_subregion(address_space_mem, XLNX_ZYNQMP_PMU_ROM_ADDR,
pmu_rom);
/* Create the RAM */
- memory_region_init_ram(pmu_ram, NULL, "xlnx-zynqmp-pmu.ram",
+ memory_region_init_ram(pmu_ram, OBJECT(machine), "xlnx-zynqmp-pmu.ram",
machine->ram_size, &error_fatal);
memory_region_add_subregion(address_space_mem, XLNX_ZYNQMP_PMU_RAM_ADDR,
pmu_ram);
diff --git a/hw/or1k/or1k-sim.c b/hw/or1k/or1k-sim.c
index 293970f156..ca2852fa87 100644
--- a/hw/or1k/or1k-sim.c
+++ b/hw/or1k/or1k-sim.c
@@ -312,7 +312,7 @@ static void openrisc_sim_init(MachineState *machine)
}
ram = g_malloc(sizeof(*ram));
- memory_region_init_ram(ram, NULL, "openrisc.ram", ram_size, &error_fatal);
+ memory_region_init_ram(ram, OBJECT(machine), "openrisc.ram", ram_size, &error_fatal);
memory_region_add_subregion(get_system_memory(), 0, ram);
openrisc_create_fdt(state, or1ksim_memmap, smp_cpus, machine->ram_size,
diff --git a/hw/or1k/virt.c b/hw/or1k/virt.c
index c0e0e3c48b..8cd520b320 100644
--- a/hw/or1k/virt.c
+++ b/hw/or1k/virt.c
@@ -498,7 +498,7 @@ static void openrisc_virt_init(MachineState *machine)
}
ram = g_malloc(sizeof(*ram));
- memory_region_init_ram(ram, NULL, "openrisc.ram", ram_size, &error_fatal);
+ memory_region_init_ram(ram, OBJECT(machine), "openrisc.ram", ram_size, &error_fatal);
memory_region_add_subregion(get_system_memory(), 0, ram);
openrisc_create_fdt(state, virt_memmap, smp_cpus, machine->ram_size,
diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c
index 7b4259c0e7..48135a7fc0 100644
--- a/hw/pci-host/bonito.c
+++ b/hw/pci-host/bonito.c
@@ -639,7 +639,7 @@ static void bonito_host_realize(DeviceState *dev, Error **errp)
for (size_t i = 0; i < 3; i++) {
char *name = g_strdup_printf("pci.lomem%zu", i);
- memory_region_init_alias(&pcimem_lo_alias[i], NULL, name,
+ memory_region_init_alias(&pcimem_lo_alias[i], OBJECT(dev), name,
&bs->pci_mem, i * 64 * MiB, 64 * MiB);
memory_region_add_subregion(get_system_memory(),
BONITO_PCILO_BASE + i * 64 * MiB,
@@ -713,7 +713,7 @@ static void bonito_pci_realize(PCIDevice *dev, Error **errp)
create_unimplemented_device(OBJECT(dev), "IOCS[3]", BONITO_DEV_BASE + 3 * 256 * KiB,
256 * KiB);
- memory_region_init_alias(pcimem_alias, NULL, "pci.mem.alias",
+ memory_region_init_alias(pcimem_alias, OBJECT(dev), "pci.mem.alias",
&bs->pci_mem, 0, BONITO_PCIHI_SIZE);
memory_region_add_subregion(host_mem, BONITO_PCIHI_BASE, pcimem_alias);
create_unimplemented_device(OBJECT(dev), "PCI_2",
diff --git a/hw/rtc/ls7a_rtc.c b/hw/rtc/ls7a_rtc.c
index 158c815505..77206b6636 100644
--- a/hw/rtc/ls7a_rtc.c
+++ b/hw/rtc/ls7a_rtc.c
@@ -388,7 +388,7 @@ static void ls7a_rtc_realize(DeviceState *dev, Error **errp)
int i;
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
LS7ARtcState *d = LS7A_RTC(sbd);
- memory_region_init_io(&d->iomem, NULL, &ls7a_rtc_ops,
+ memory_region_init_io(&d->iomem, OBJECT(dev), &ls7a_rtc_ops,
(void *)d, "ls7a_rtc", 0x100);
sysbus_init_irq(sbd, &d->irq);
diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index a96ccca8e3..f9ef2758e1 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -345,7 +345,7 @@ static void leon3_generic_hw_init(MachineState *machine)
/* Allocate BIOS */
prom_size = 8 * MiB;
- memory_region_init_rom(prom, NULL, "Leon3.bios", prom_size, &error_fatal);
+ memory_region_init_rom(prom, OBJECT(machine), "Leon3.bios", prom_size, &error_fatal);
memory_region_add_subregion(address_space_mem, LEON3_PROM_OFFSET, prom);
/* Load boot prom */
diff --git a/hw/sparc64/niagara.c b/hw/sparc64/niagara.c
index 8fb9937127..58384e80da 100644
--- a/hw/sparc64/niagara.c
+++ b/hw/sparc64/niagara.c
@@ -106,23 +106,23 @@ static void niagara_init(MachineState *machine)
/* init CPUs */
sparc64_cpu_devinit(machine->cpu_type, NIAGARA_PROM_BASE);
/* set up devices */
- memory_region_init_ram(&s->hv_ram, NULL, "sun4v-hv.ram",
+ memory_region_init_ram(&s->hv_ram, OBJECT(machine), "sun4v-hv.ram",
NIAGARA_HV_RAM_SIZE, &error_fatal);
memory_region_add_subregion(sysmem, NIAGARA_HV_RAM_BASE, &s->hv_ram);
memory_region_add_subregion(sysmem, NIAGARA_PARTITION_RAM_BASE,
machine->ram);
- memory_region_init_ram(&s->nvram, NULL, "sun4v.nvram", NIAGARA_NVRAM_SIZE,
+ memory_region_init_ram(&s->nvram, OBJECT(machine), "sun4v.nvram", NIAGARA_NVRAM_SIZE,
&error_fatal);
memory_region_add_subregion(sysmem, NIAGARA_NVRAM_BASE, &s->nvram);
- memory_region_init_ram(&s->md_rom, NULL, "sun4v-md.rom",
+ memory_region_init_ram(&s->md_rom, OBJECT(machine), "sun4v-md.rom",
NIAGARA_MD_ROM_SIZE, &error_fatal);
memory_region_add_subregion(sysmem, NIAGARA_MD_ROM_BASE, &s->md_rom);
- memory_region_init_ram(&s->hv_rom, NULL, "sun4v-hv.rom",
+ memory_region_init_ram(&s->hv_rom, OBJECT(machine), "sun4v-hv.rom",
NIAGARA_HV_ROM_SIZE, &error_fatal);
memory_region_add_subregion(sysmem, NIAGARA_HV_ROM_BASE, &s->hv_rom);
- memory_region_init_ram(&s->prom, NULL, "sun4v.prom", PROM_SIZE_MAX,
+ memory_region_init_ram(&s->prom, OBJECT(machine), "sun4v.prom", PROM_SIZE_MAX,
&error_fatal);
memory_region_add_subregion(sysmem, NIAGARA_PROM_BASE, &s->prom);
@@ -140,7 +140,8 @@ static void niagara_init(MachineState *machine)
BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
int size = blk_getlength(blk);
if (size > 0) {
- memory_region_init_ram(&s->vdisk_ram, NULL, "sun4v_vdisk.ram", size,
+ memory_region_init_ram(&s->vdisk_ram, OBJECT(machine), "sun4v_vdisk.ram",
+ size,
&error_fatal);
memory_region_add_subregion(get_system_memory(),
NIAGARA_VDISK_BASE, &s->vdisk_ram);
diff --git a/hw/vmapple/vmapple.c b/hw/vmapple/vmapple.c
index 67e499b74a..cea7e3d2f4 100644
--- a/hw/vmapple/vmapple.c
+++ b/hw/vmapple/vmapple.c
@@ -357,7 +357,7 @@ static void vmapple_firmware_init(VMAppleMachineState *vms,
exit(1);
}
- memory_region_init_ram(&vms->fw_mr, NULL, "firmware", size, &error_fatal);
+ memory_region_init_ram(&vms->fw_mr, OBJECT(vms), "firmware", size, &error_fatal);
image_size = load_image_mr(fname, &vms->fw_mr);
g_free(fname);
diff --git a/hw/xen/xen-pvh-common.c b/hw/xen/xen-pvh-common.c
index dae523f723..1047aabd57 100644
--- a/hw/xen/xen-pvh-common.c
+++ b/hw/xen/xen-pvh-common.c
@@ -109,12 +109,12 @@ static void xen_pvh_init_ram(XenPVHMachineState *s,
}
if (s->cfg.mapcache) {
- memory_region_init_ram(&xen_memory, NULL, "xen.ram",
+ memory_region_init_ram(&xen_memory, OBJECT(s), "xen.ram",
block_len, &error_fatal);
- memory_region_init_alias(&s->ram.low, NULL, "xen.ram.lo", &xen_memory,
+ memory_region_init_alias(&s->ram.low, OBJECT(s), "xen.ram.lo", &xen_memory,
s->cfg.ram_low.base, ram_size[0]);
if (ram_size[1] > 0) {
- memory_region_init_alias(&s->ram.high, NULL, "xen.ram.hi",
+ memory_region_init_alias(&s->ram.high, OBJECT(s), "xen.ram.hi",
&xen_memory,
s->cfg.ram_high.base, ram_size[1]);
}
@@ -122,11 +122,11 @@ static void xen_pvh_init_ram(XenPVHMachineState *s,
void *p;
p = xen_map_guest_ram(s, s->cfg.ram_low.base, ram_size[0]);
- memory_region_init_ram_ptr(&s->ram.low, NULL, "xen.ram.lo",
+ memory_region_init_ram_ptr(&s->ram.low, OBJECT(s), "xen.ram.lo",
ram_size[0], p);
if (ram_size[1] > 0) {
p = xen_map_guest_ram(s, s->cfg.ram_high.base, ram_size[1]);
- memory_region_init_ram_ptr(&s->ram.high, NULL, "xen.ram.hi",
+ memory_region_init_ram_ptr(&s->ram.high, OBJECT(s), "xen.ram.hi",
ram_size[1], p);
}
}
@@ -140,7 +140,7 @@ static void xen_pvh_init_ram(XenPVHMachineState *s,
/* Grants are only supported when the mapcache is on. */
if (s->cfg.mapcache) {
/* Setup support for grants. */
- memory_region_init_ram(&xen_grants, NULL, "xen.grants", block_len,
+ memory_region_init_ram(&xen_grants, OBJECT(s), "xen.grants", block_len,
&error_fatal);
memory_region_add_subregion(sysmem, XEN_GRANT_ADDR_OFF, &xen_grants);
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 091/134] hw/mips: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (89 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 090/134] hw/misc-boards: Give memory regions an explicit owner Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 092/134] hw/riscv: " Alexander Graf
` (43 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert memory_region_init*() calls that pass NULL owner to pass
the enclosing machine instead. All sites are inside board init
functions (MachineState *machine) or a helper that already carries
an Object *parent from the earlier hw/mips device-parenting patch (malta_fpga_init).
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/mips/boston.c | 8 ++++----
hw/mips/fuloong2e.c | 2 +-
hw/mips/jazz.c | 16 ++++++++--------
hw/mips/loongson3_virt.c | 6 +++---
hw/mips/malta.c | 12 ++++++------
5 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/hw/mips/boston.c b/hw/mips/boston.c
index a156b218fb..f012f22307 100644
--- a/hw/mips/boston.c
+++ b/hw/mips/boston.c
@@ -711,7 +711,7 @@ static void boston_mach_init(MachineState *machine)
sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->cps), 0, 0, 1);
flash = g_new(MemoryRegion, 1);
- memory_region_init_rom(flash, NULL, "boston.flash",
+ memory_region_init_rom(flash, OBJECT(machine), "boston.flash",
boston_memmap[BOSTON_FLASH].size, &error_fatal);
memory_region_add_subregion_overlap(sys_mem,
boston_memmap[BOSTON_FLASH].base,
@@ -722,7 +722,7 @@ static void boston_mach_init(MachineState *machine)
machine->ram, 0);
ddr_low_alias = g_new(MemoryRegion, 1);
- memory_region_init_alias(ddr_low_alias, NULL, "boston_low.ddr",
+ memory_region_init_alias(ddr_low_alias, OBJECT(machine), "boston_low.ddr",
machine->ram, 0,
MIN(machine->ram_size, (256 * MiB)));
memory_region_add_subregion_overlap(sys_mem, 0, ddr_low_alias, 0);
@@ -749,7 +749,7 @@ static void boston_mach_init(MachineState *machine)
get_cps_irq(&s->cps, 0));
platreg = g_new(MemoryRegion, 1);
- memory_region_init_io(platreg, NULL, &boston_platreg_ops, s,
+ memory_region_init_io(platreg, OBJECT(machine), &boston_platreg_ops, s,
"boston-platregs",
boston_memmap[BOSTON_PLATREG].size);
memory_region_add_subregion_overlap(sys_mem,
@@ -761,7 +761,7 @@ static void boston_mach_init(MachineState *machine)
serial_hd(0), DEVICE_LITTLE_ENDIAN);
lcd = g_new(MemoryRegion, 1);
- memory_region_init_io(lcd, NULL, &boston_lcd_ops, s, "boston-lcd", 0x8);
+ memory_region_init_io(lcd, OBJECT(machine), &boston_lcd_ops, s, "boston-lcd", 0x8);
memory_region_add_subregion_overlap(sys_mem,
boston_memmap[BOSTON_LCD].base, lcd, 0);
diff --git a/hw/mips/fuloong2e.c b/hw/mips/fuloong2e.c
index 1b105ca37c..29e6561f2a 100644
--- a/hw/mips/fuloong2e.c
+++ b/hw/mips/fuloong2e.c
@@ -245,7 +245,7 @@ static void mips_fuloong2e_init(MachineState *machine)
memory_region_add_subregion(address_space_mem, 0, machine->ram);
/* Boot ROM */
- memory_region_init_rom(bios, NULL, "fuloong2e.bios", BIOS_SIZE,
+ memory_region_init_rom(bios, OBJECT(machine), "fuloong2e.bios", BIOS_SIZE,
&error_fatal);
memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios);
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index cb24d8c00d..8999efb352 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -234,9 +234,9 @@ static void mips_jazz_init(MachineState *machine,
/* allocate RAM */
memory_region_add_subregion(address_space, 0, machine->ram);
- memory_region_init_rom(bios, NULL, "mips_jazz.bios", MAGNUM_BIOS_SIZE,
+ memory_region_init_rom(bios, OBJECT(machine), "mips_jazz.bios", MAGNUM_BIOS_SIZE,
&error_fatal);
- memory_region_init_alias(bios2, NULL, "mips_jazz.bios", bios,
+ memory_region_init_alias(bios2, OBJECT(machine), "mips_jazz.bios", bios,
0, MAGNUM_BIOS_SIZE);
memory_region_add_subregion(address_space, 0x1fc00000LL, bios);
memory_region_add_subregion(address_space, 0xfff00000LL, bios2);
@@ -270,17 +270,17 @@ static void mips_jazz_init(MachineState *machine,
sysbus_mmio_get_region(sysbus, 0));
memory_region_add_subregion(address_space, 0xf0000000,
sysbus_mmio_get_region(sysbus, 1));
- memory_region_init_io(dma_dummy, NULL, &dma_dummy_ops,
+ memory_region_init_io(dma_dummy, OBJECT(machine), &dma_dummy_ops,
NULL, "dummy_dma", 0x1000);
memory_region_add_subregion(address_space, 0x8000d000, dma_dummy);
- memory_region_init_rom(dp8393x_prom, NULL, "dp8393x-jazz.prom",
+ memory_region_init_rom(dp8393x_prom, OBJECT(machine), "dp8393x-jazz.prom",
SONIC_PROM_SIZE, &error_fatal);
memory_region_add_subregion(address_space, 0x8000b000, dp8393x_prom);
/* ISA bus: IO space at 0x90000000, mem space at 0x91000000 */
- memory_region_init(isa_io, NULL, "isa-io", 0x00010000);
- memory_region_init(isa_mem, NULL, "isa-mem", 0x01000000);
+ memory_region_init(isa_io, OBJECT(machine), "isa-io", 0x00010000);
+ memory_region_init(isa_mem, OBJECT(machine), "isa-mem", 0x01000000);
memory_region_add_subregion(address_space, 0x90000000, isa_io);
memory_region_add_subregion(address_space, 0x91000000, isa_mem);
isa_bus = isa_bus_new_bridge(OBJECT(machine), isa_mem, isa_io, &error_abort);
@@ -306,7 +306,7 @@ static void mips_jazz_init(MachineState *machine,
{
/* Simple ROM, so user doesn't have to provide one */
MemoryRegion *rom_mr = g_new(MemoryRegion, 1);
- memory_region_init_rom(rom_mr, NULL, "g364fb.rom", 0x80000,
+ memory_region_init_rom(rom_mr, OBJECT(machine), "g364fb.rom", 0x80000,
&error_fatal);
uint8_t *rom = memory_region_get_ram_ptr(rom_mr);
memory_region_add_subregion(address_space, 0x60000000, rom_mr);
@@ -357,7 +357,7 @@ static void mips_jazz_init(MachineState *machine,
/* Real time clock */
mc146818_rtc_init(OBJECT(machine), isa_bus, 1980, NULL);
- memory_region_init_io(rtc, NULL, &rtc_ops, NULL, "rtc", 0x1000);
+ memory_region_init_io(rtc, OBJECT(machine), &rtc_ops, NULL, "rtc", 0x1000);
memory_region_add_subregion(address_space, 0x80004000, rtc);
/* Keyboard (i8042) */
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index 93c14026ab..97d097373d 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -586,11 +586,11 @@ static void mips_loongson3_virt_init(MachineState *machine)
assert(cpu); /* This variable points to the first created cpu. */
/* Allocate RAM/BIOS, 0x00000000~0x10000000 is alias of 0x80000000~0x90000000 */
- memory_region_init_rom(bios, NULL, "loongson3.bios",
+ memory_region_init_rom(bios, OBJECT(machine), "loongson3.bios",
virt_memmap[VIRT_BIOS_ROM].size, &error_fatal);
- memory_region_init_alias(ram, NULL, "loongson3.lowmem",
+ memory_region_init_alias(ram, OBJECT(machine), "loongson3.lowmem",
machine->ram, 0, virt_memmap[VIRT_LOWMEM].size);
- memory_region_init_io(iomem, NULL, &loongson3_pm_ops,
+ memory_region_init_io(iomem, OBJECT(machine), &loongson3_pm_ops,
NULL, "loongson3_pm", virt_memmap[VIRT_PM].size);
qemu_register_wakeup_support();
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index 72bc97625f..e1d8c3b4dd 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -577,11 +577,11 @@ static MaltaFPGAState *malta_fpga_init(Object *parent, MemoryRegion *address_spa
s = g_new0(MaltaFPGAState, 1);
- memory_region_init_io(&s->iomem, NULL, &malta_fpga_ops, s,
+ memory_region_init_io(&s->iomem, parent, &malta_fpga_ops, s,
"malta-fpga", 0x100000);
- memory_region_init_alias(&s->iomem_lo, NULL, "malta-fpga",
+ memory_region_init_alias(&s->iomem_lo, parent, "malta-fpga",
&s->iomem, 0, 0x900);
- memory_region_init_alias(&s->iomem_hi, NULL, "malta-fpga",
+ memory_region_init_alias(&s->iomem_hi, parent, "malta-fpga",
&s->iomem, 0xa00, 0x100000 - 0xa00);
memory_region_add_subregion(address_space, base, &s->iomem_lo);
@@ -1115,14 +1115,14 @@ void mips_malta_init(MachineState *machine)
memory_region_add_subregion(system_memory, 0x80000000, machine->ram);
/* alias for pre IO hole access */
- memory_region_init_alias(ram_low_preio, NULL, "mips_malta_low_preio.ram",
+ memory_region_init_alias(ram_low_preio, OBJECT(machine), "mips_malta_low_preio.ram",
machine->ram, 0, MIN(ram_size, 256 * MiB));
memory_region_add_subregion(system_memory, 0, ram_low_preio);
/* alias for post IO hole access, if there is enough RAM */
if (ram_size > 512 * MiB) {
ram_low_postio = g_new(MemoryRegion, 1);
- memory_region_init_alias(ram_low_postio, NULL,
+ memory_region_init_alias(ram_low_postio, OBJECT(machine),
"mips_malta_low_postio.ram",
machine->ram, 512 * MiB,
ram_size - 512 * MiB);
@@ -1213,7 +1213,7 @@ void mips_malta_init(MachineState *machine)
* handled by an overlapping region as the resulting ROM code subpage
* regions are not executable.
*/
- memory_region_init_ram(bios_copy, NULL, "bios.1fc", BIOS_SIZE,
+ memory_region_init_ram(bios_copy, OBJECT(machine), "bios.1fc", BIOS_SIZE,
&error_fatal);
if (!rom_copy(memory_region_get_ram_ptr(bios_copy),
FLASH_ADDRESS, BIOS_SIZE)) {
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 092/134] hw/riscv: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (90 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 091/134] hw/mips: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 093/134] hw/i386: " Alexander Graf
` (42 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert memory_region_init*() calls that pass NULL owner to pass
the enclosing machine or SoC device instead. All sites are inside
board init (MachineState *machine) or SoC realize (DeviceState *dev)
functions.
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/riscv/boston-aia.c | 8 ++++----
hw/riscv/microblaze-v-generic.c | 4 ++--
hw/riscv/microchip_pfsoc.c | 14 +++++++-------
hw/riscv/sifive_u.c | 4 ++--
hw/riscv/spike.c | 2 +-
hw/riscv/tt_atlantis.c | 2 +-
hw/riscv/virt.c | 2 +-
7 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/hw/riscv/boston-aia.c b/hw/riscv/boston-aia.c
index 5a9ec28068..ef41f53aac 100644
--- a/hw/riscv/boston-aia.c
+++ b/hw/riscv/boston-aia.c
@@ -374,7 +374,7 @@ static void boston_mach_init(MachineState *machine)
sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->cps), 0, 0, 1);
flash = g_new(MemoryRegion, 1);
- memory_region_init_rom(flash, NULL, "boston.flash",
+ memory_region_init_rom(flash, OBJECT(machine), "boston.flash",
boston_memmap[BOSTON_FLASH].size, &error_fatal);
memory_region_add_subregion_overlap(sys_mem,
boston_memmap[BOSTON_FLASH].base,
@@ -385,7 +385,7 @@ static void boston_mach_init(MachineState *machine)
machine->ram, 0);
ddr_low_alias = g_new(MemoryRegion, 1);
- memory_region_init_alias(ddr_low_alias, NULL, "boston_low.ddr",
+ memory_region_init_alias(ddr_low_alias, OBJECT(machine), "boston_low.ddr",
machine->ram, 0,
MIN(machine->ram_size, (256 * MiB)));
memory_region_add_subregion_overlap(sys_mem, 0, ddr_low_alias, 0);
@@ -398,7 +398,7 @@ static void boston_mach_init(MachineState *machine)
qdev_get_gpio_in(s->cps.aplic, PCIE2_INT));
platreg = g_new(MemoryRegion, 1);
- memory_region_init_io(platreg, NULL, &boston_platreg_ops, s,
+ memory_region_init_io(platreg, OBJECT(machine), &boston_platreg_ops, s,
"boston-platregs",
boston_memmap[BOSTON_PLATREG].size);
memory_region_add_subregion_overlap(sys_mem,
@@ -410,7 +410,7 @@ static void boston_mach_init(MachineState *machine)
serial_hd(0), DEVICE_LITTLE_ENDIAN);
lcd = g_new(MemoryRegion, 1);
- memory_region_init_io(lcd, NULL, &boston_lcd_ops, s, "boston-lcd", 0x8);
+ memory_region_init_io(lcd, OBJECT(machine), &boston_lcd_ops, s, "boston-lcd", 0x8);
memory_region_add_subregion_overlap(sys_mem,
boston_memmap[BOSTON_LCD].base, lcd, 0);
diff --git a/hw/riscv/microblaze-v-generic.c b/hw/riscv/microblaze-v-generic.c
index 7253ae7822..0a83932405 100644
--- a/hw/riscv/microblaze-v-generic.c
+++ b/hw/riscv/microblaze-v-generic.c
@@ -70,12 +70,12 @@ static void mb_v_generic_init(MachineState *machine)
object_property_set_bool(OBJECT(cpu), "d", false, NULL);
qdev_realize(DEVICE(cpu), NULL, &error_abort);
/* Attach emulated BRAM through the LMB. */
- memory_region_init_ram(phys_lmb_bram, NULL,
+ memory_region_init_ram(phys_lmb_bram, OBJECT(machine),
"mb_v.lmb_bram", LMB_BRAM_SIZE,
&error_fatal);
memory_region_add_subregion(sysmem, 0x00000000, phys_lmb_bram);
- memory_region_init_ram(phys_ram, NULL, "mb_v.ram",
+ memory_region_init_ram(phys_ram, OBJECT(machine), "mb_v.ram",
ram_size, &error_fatal);
memory_region_add_subregion(sysmem, ddr_base, phys_ram);
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index 0a98ac1c5e..f1ee64ef86 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -219,14 +219,14 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
qdev_realize(DEVICE(&s->u_cluster), NULL, &error_abort);
/* Reserved Memory at address 0 */
- memory_region_init_ram(rsvd0_mem, NULL, "microchip.pfsoc.rsvd0_mem",
+ memory_region_init_ram(rsvd0_mem, OBJECT(dev), "microchip.pfsoc.rsvd0_mem",
memmap[MICROCHIP_PFSOC_RSVD0].size, &error_fatal);
memory_region_add_subregion(system_memory,
memmap[MICROCHIP_PFSOC_RSVD0].base,
rsvd0_mem);
/* E51 DTIM */
- memory_region_init_ram(e51_dtim_mem, NULL, "microchip.pfsoc.e51_dtim_mem",
+ memory_region_init_ram(e51_dtim_mem, OBJECT(dev), "microchip.pfsoc.e51_dtim_mem",
memmap[MICROCHIP_PFSOC_E51_DTIM].size, &error_fatal);
memory_region_add_subregion(system_memory,
memmap[MICROCHIP_PFSOC_E51_DTIM].base,
@@ -271,7 +271,7 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
* leave it enabled all the time. This won't break anything, but will be
* too generous to misbehaving guests.
*/
- memory_region_init_ram(l2lim_mem, NULL, "microchip.pfsoc.l2lim",
+ memory_region_init_ram(l2lim_mem, OBJECT(dev), "microchip.pfsoc.l2lim",
memmap[MICROCHIP_PFSOC_L2LIM].size, &error_fatal);
memory_region_add_subregion(system_memory,
memmap[MICROCHIP_PFSOC_L2LIM].base,
@@ -549,10 +549,10 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
/* Split RAM into low and high regions using aliases to machine->ram */
mem_low_size = memmap[MICROCHIP_PFSOC_DRAM_LO].size;
mem_high_size = machine->ram_size - mem_low_size;
- memory_region_init_alias(mem_low, NULL,
+ memory_region_init_alias(mem_low, OBJECT(machine),
"microchip.icicle.kit.ram_low", machine->ram,
0, mem_low_size);
- memory_region_init_alias(mem_high, NULL,
+ memory_region_init_alias(mem_high, OBJECT(machine),
"microchip.icicle.kit.ram_high", machine->ram,
mem_low_size, mem_high_size);
@@ -565,13 +565,13 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
mem_high);
/* Create aliases for the low and high RAM regions */
- memory_region_init_alias(mem_low_alias, NULL,
+ memory_region_init_alias(mem_low_alias, OBJECT(machine),
"microchip.icicle.kit.ram_low.alias",
mem_low, 0, mem_low_size);
memory_region_add_subregion(system_memory,
memmap[MICROCHIP_PFSOC_DRAM_LO_ALIAS].base,
mem_low_alias);
- memory_region_init_alias(mem_high_alias, NULL,
+ memory_region_init_alias(mem_high_alias, OBJECT(machine),
"microchip.icicle.kit.ram_high.alias",
mem_high, 0, mem_high_size);
memory_region_add_subregion(system_memory,
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index aba6716b73..9d3f5c8f59 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -477,7 +477,7 @@ static void sifive_u_machine_init(MachineState *machine)
machine->ram);
/* register QSPI0 Flash */
- memory_region_init_ram(flash0, NULL, "riscv.sifive.u.flash0",
+ memory_region_init_ram(flash0, OBJECT(machine), "riscv.sifive.u.flash0",
memmap[SIFIVE_U_DEV_FLASH0].size, &error_fatal);
memory_region_add_subregion(system_memory, memmap[SIFIVE_U_DEV_FLASH0].base,
flash0);
@@ -763,7 +763,7 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
* leave it enabled all the time. This won't break anything, but will be
* too generous to misbehaving guests.
*/
- memory_region_init_ram(l2lim_mem, NULL, "riscv.sifive.u.l2lim",
+ memory_region_init_ram(l2lim_mem, OBJECT(dev), "riscv.sifive.u.l2lim",
memmap[SIFIVE_U_DEV_L2LIM].size, &error_fatal);
memory_region_add_subregion(system_memory, memmap[SIFIVE_U_DEV_L2LIM].base,
l2lim_mem);
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
index c53409e4f1..9f1a1b5898 100644
--- a/hw/riscv/spike.c
+++ b/hw/riscv/spike.c
@@ -179,7 +179,7 @@ static void spike_board_init(MachineState *machine)
machine->ram);
/* boot rom */
- memory_region_init_rom(mask_rom, NULL, "riscv.spike.mrom",
+ memory_region_init_rom(mask_rom, OBJECT(machine), "riscv.spike.mrom",
memmap[SPIKE_MROM].size, &error_fatal);
memory_region_add_subregion(system_memory, memmap[SPIKE_MROM].base,
mask_rom);
diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c
index 9ae5af3162..f068d8751e 100644
--- a/hw/riscv/tt_atlantis.c
+++ b/hw/riscv/tt_atlantis.c
@@ -539,7 +539,7 @@ static void tt_atlantis_machine_init(MachineState *machine)
s->memmap[TT_ATL_DDR_LO].base, ram_lo);
/* Boot ROM */
- memory_region_init_rom(bootrom, NULL, "tt-atlantis.bootrom",
+ memory_region_init_rom(bootrom, OBJECT(machine), "tt-atlantis.bootrom",
s->memmap[TT_ATL_BOOTROM].size, &error_fatal);
memory_region_add_subregion(system_memory, s->memmap[TT_ATL_BOOTROM].base,
bootrom);
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index 7e5bdaf210..d1de8bb2be 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -1463,7 +1463,7 @@ static void virt_machine_init(MachineState *machine)
machine->ram);
/* boot rom */
- memory_region_init_rom(mask_rom, NULL, "riscv_virt_board.mrom",
+ memory_region_init_rom(mask_rom, OBJECT(machine), "riscv_virt_board.mrom",
s->memmap[VIRT_MROM].size, &error_fatal);
memory_region_add_subregion(system_memory, s->memmap[VIRT_MROM].base,
mask_rom);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 093/134] hw/i386: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (91 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 092/134] hw/riscv: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 094/134] hw/arm: " Alexander Graf
` (41 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert memory_region_init*() calls that pass NULL owner to pass
the enclosing PC/x86/microvm machine or device instead.
Thread X86MachineState through x86_isa_bios_init() so the isa-bios
alias is owned by the machine that creates it.
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/i386/microvm.c | 4 ++--
hw/i386/pc.c | 8 ++++----
hw/i386/pc_piix.c | 2 +-
hw/i386/pc_q35.c | 2 +-
hw/i386/pc_sysfw.c | 6 +++---
hw/i386/x86-common.c | 11 ++++++-----
hw/i386/xen/xen-hvm.c | 8 ++++----
hw/i386/xen/xen_pvdevice.c | 2 +-
include/hw/i386/x86.h | 3 ++-
9 files changed, 24 insertions(+), 22 deletions(-)
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index aa0e1ef155..751e3962fa 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -305,7 +305,7 @@ static void microvm_memory_init(MicrovmMachineState *mms)
}
ram_below_4g = g_malloc(sizeof(*ram_below_4g));
- memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", machine->ram,
+ memory_region_init_alias(ram_below_4g, OBJECT(mms), "ram-below-4g", machine->ram,
0, x86ms->below_4g_mem_size);
memory_region_add_subregion(system_memory, 0, ram_below_4g);
@@ -313,7 +313,7 @@ static void microvm_memory_init(MicrovmMachineState *mms)
if (x86ms->above_4g_mem_size > 0) {
ram_above_4g = g_malloc(sizeof(*ram_above_4g));
- memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g",
+ memory_region_init_alias(ram_above_4g, OBJECT(mms), "ram-above-4g",
machine->ram,
x86ms->below_4g_mem_size,
x86ms->above_4g_mem_size);
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index e505391985..8057058ff0 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -795,13 +795,13 @@ void pc_memory_init(PCMachineState *pcms,
* done for backwards compatibility with older qemus.
*/
ram_below_4g = g_malloc(sizeof(*ram_below_4g));
- memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", machine->ram,
+ memory_region_init_alias(ram_below_4g, OBJECT(pcms), "ram-below-4g", machine->ram,
0, x86ms->below_4g_mem_size);
memory_region_add_subregion(system_memory, 0, ram_below_4g);
e820_add_entry(0, x86ms->below_4g_mem_size, E820_RAM);
if (x86ms->above_4g_mem_size > 0) {
ram_above_4g = g_malloc(sizeof(*ram_above_4g));
- memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g",
+ memory_region_init_alias(ram_above_4g, OBJECT(pcms), "ram-above-4g",
machine->ram,
x86ms->below_4g_mem_size,
x86ms->above_4g_mem_size);
@@ -871,10 +871,10 @@ void pc_memory_init(PCMachineState *pcms,
if (!is_tdx_vm()) {
option_rom_mr = g_malloc(sizeof(*option_rom_mr));
if (machine_require_guest_memfd(machine)) {
- memory_region_init_ram_guest_memfd(option_rom_mr, NULL, "pc.rom",
+ memory_region_init_ram_guest_memfd(option_rom_mr, OBJECT(pcms), "pc.rom",
PC_ROM_SIZE, &error_fatal);
} else {
- memory_region_init_ram(option_rom_mr, NULL, "pc.rom", PC_ROM_SIZE,
+ memory_region_init_ram(option_rom_mr, OBJECT(pcms), "pc.rom", PC_ROM_SIZE,
&error_fatal);
if (pcmc->pci_enabled) {
memory_region_set_readonly(option_rom_mr, true);
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index c9e6c61734..0b8d7d88b9 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -191,7 +191,7 @@ static void pc_init1(MachineState *machine, const char *pci_type)
}
pci_memory = g_new(MemoryRegion, 1);
- memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
+ memory_region_init(pci_memory, OBJECT(machine), "pci", UINT64_MAX);
phb = OBJECT(qdev_new(OBJECT(machine), "i440fx", TYPE_I440FX_PCI_HOST_BRIDGE));
object_property_set_link(phb, PCI_HOST_PROP_RAM_MEM,
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 62625abed8..b2cdca8ade 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -208,7 +208,7 @@ static void pc_q35_init(MachineState *machine)
&error_abort);
/* allocate ram and load rom/bios */
- memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
+ memory_region_init(pci_memory, OBJECT(machine), "pci", UINT64_MAX);
pc_memory_init(pcms, system_memory, pci_memory, pci_hole64_size);
object_property_set_link(phb, PCI_HOST_PROP_RAM_MEM,
diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
index 02d75e2838..b536fca60f 100644
--- a/hw/i386/pc_sysfw.c
+++ b/hw/i386/pc_sysfw.c
@@ -52,10 +52,10 @@ static void pc_isa_bios_init(PCMachineState *pcms, MemoryRegion *isa_bios,
/* map the last 128KB of the BIOS in ISA space */
isa_bios_size = MIN(flash_size, 128 * KiB);
if (machine_require_guest_memfd(MACHINE(pcms))) {
- memory_region_init_ram_guest_memfd(isa_bios, NULL, "isa-bios",
+ memory_region_init_ram_guest_memfd(isa_bios, OBJECT(pcms), "isa-bios",
isa_bios_size, &error_fatal);
} else {
- memory_region_init_ram(isa_bios, NULL, "isa-bios", isa_bios_size,
+ memory_region_init_ram(isa_bios, OBJECT(pcms), "isa-bios", isa_bios_size,
&error_fatal);
}
memory_region_add_subregion_overlap(rom_memory,
@@ -189,7 +189,7 @@ static void pc_system_flash_map(PCMachineState *pcms,
if (i == 0) {
flash_mem = pflash_cfi01_get_memory(system_flash);
if (pcmc->isa_bios_alias) {
- x86_isa_bios_init(&x86ms->isa_bios, rom_memory, flash_mem,
+ x86_isa_bios_init(x86ms, &x86ms->isa_bios, rom_memory, flash_mem,
true);
} else {
pc_isa_bios_init(pcms, &x86ms->isa_bios, rom_memory, flash_mem);
diff --git a/hw/i386/x86-common.c b/hw/i386/x86-common.c
index 73a53fbf3f..151a67ee5f 100644
--- a/hw/i386/x86-common.c
+++ b/hw/i386/x86-common.c
@@ -993,13 +993,14 @@ void x86_load_linux(X86MachineState *x86ms,
nb_option_roms++;
}
-void x86_isa_bios_init(MemoryRegion *isa_bios, MemoryRegion *isa_memory,
+void x86_isa_bios_init(X86MachineState *x86ms, MemoryRegion *isa_bios,
+ MemoryRegion *isa_memory,
MemoryRegion *bios, bool read_only)
{
uint64_t bios_size = memory_region_size(bios);
uint64_t isa_bios_size = MIN(bios_size, 128 * KiB);
- memory_region_init_alias(isa_bios, NULL, "isa-bios", bios,
+ memory_region_init_alias(isa_bios, OBJECT(x86ms), "isa-bios", bios,
bios_size - isa_bios_size, isa_bios_size);
memory_region_add_subregion_overlap(isa_memory, 1 * MiB - isa_bios_size,
isa_bios, 1);
@@ -1036,13 +1037,13 @@ static void load_bios_from_file(X86MachineState *x86ms, const char *bios_name,
/* BIOS load */
if (machine_require_guest_memfd(MACHINE(x86ms))) {
- memory_region_init_ram_guest_memfd(&x86ms->bios, NULL, "pc.bios",
+ memory_region_init_ram_guest_memfd(&x86ms->bios, OBJECT(x86ms), "pc.bios",
bios_size, &error_fatal);
if (is_tdx_vm()) {
tdx_set_tdvf_region(&x86ms->bios);
}
} else {
- memory_region_init_ram(&x86ms->bios, NULL, "pc.bios",
+ memory_region_init_ram(&x86ms->bios, OBJECT(x86ms), "pc.bios",
bios_size, &error_fatal);
}
if (sev_enabled() || is_tdx_vm()) {
@@ -1107,7 +1108,7 @@ void x86_bios_rom_init(X86MachineState *x86ms, const char *default_firmware,
if (!machine_require_guest_memfd(MACHINE(x86ms))) {
/* map the last 128KB of the BIOS in ISA space */
- x86_isa_bios_init(&x86ms->isa_bios, rom_memory, &x86ms->bios,
+ x86_isa_bios_init(x86ms, &x86ms->isa_bios, rom_memory, &x86ms->bios,
!isapc_ram_fw);
}
diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c
index d3ce082e07..01d851ce3e 100644
--- a/hw/i386/xen/xen-hvm.c
+++ b/hw/i386/xen/xen-hvm.c
@@ -156,11 +156,11 @@ static void xen_ram_init(PCMachineState *pcms,
*/
block_len = (4 * GiB) + x86ms->above_4g_mem_size;
}
- memory_region_init_ram(&xen_memory, NULL, "xen.ram", block_len,
+ memory_region_init_ram(&xen_memory, OBJECT(pcms), "xen.ram", block_len,
&error_fatal);
*ram_memory_p = &xen_memory;
- memory_region_init_alias(&ram_640k, NULL, "xen.ram.640k",
+ memory_region_init_alias(&ram_640k, OBJECT(pcms), "xen.ram.640k",
&xen_memory, 0, 0xa0000);
memory_region_add_subregion(sysmem, 0, &ram_640k);
/* Skip of the VGA IO memory space, it will be registered later by the VGA
@@ -169,12 +169,12 @@ static void xen_ram_init(PCMachineState *pcms,
* The area between 0xc0000 and 0x100000 will be used by SeaBIOS to load
* the Options ROM, so it is registered here as RAM.
*/
- memory_region_init_alias(&ram_lo, NULL, "xen.ram.lo",
+ memory_region_init_alias(&ram_lo, OBJECT(pcms), "xen.ram.lo",
&xen_memory, 0xc0000,
x86ms->below_4g_mem_size - 0xc0000);
memory_region_add_subregion(sysmem, 0xc0000, &ram_lo);
if (x86ms->above_4g_mem_size > 0) {
- memory_region_init_alias(&ram_hi, NULL, "xen.ram.hi",
+ memory_region_init_alias(&ram_hi, OBJECT(pcms), "xen.ram.hi",
&xen_memory, 0x100000000ULL,
x86ms->above_4g_mem_size);
memory_region_add_subregion(sysmem, 0x100000000ULL, &ram_hi);
diff --git a/hw/i386/xen/xen_pvdevice.c b/hw/i386/xen/xen_pvdevice.c
index fab26a06af..6c255aeae1 100644
--- a/hw/i386/xen/xen_pvdevice.c
+++ b/hw/i386/xen/xen_pvdevice.c
@@ -108,7 +108,7 @@ static void xen_pv_realize(PCIDevice *pci_dev, Error **errp)
pci_conf[PCI_INTERRUPT_PIN] = 1;
- memory_region_init_io(&d->mmio, NULL, &xen_pv_mmio_ops, d,
+ memory_region_init_io(&d->mmio, OBJECT(pci_dev), &xen_pv_mmio_ops, d,
"mmio", d->size);
pci_register_bar(pci_dev, 1, PCI_BASE_ADDRESS_MEM_PREFETCH,
diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
index 61d6ec1755..9d5d7694d4 100644
--- a/include/hw/i386/x86.h
+++ b/include/hw/i386/x86.h
@@ -121,7 +121,8 @@ void x86_cpu_unplug_request_cb(HotplugHandler *hotplug_dev,
void x86_cpu_unplug_cb(HotplugHandler *hotplug_dev,
DeviceState *dev, Error **errp);
-void x86_isa_bios_init(MemoryRegion *isa_bios, MemoryRegion *isa_memory,
+void x86_isa_bios_init(X86MachineState *x86ms, MemoryRegion *isa_bios,
+ MemoryRegion *isa_memory,
MemoryRegion *bios, bool read_only);
void x86_bios_rom_init(X86MachineState *x86ms, const char *default_firmware,
MemoryRegion *rom_memory, bool isapc_ram_fw);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 094/134] hw/arm: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (92 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 093/134] hw/i386: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-12 15:12 ` Bernhard Beschow
2026-07-11 22:36 ` [RFC PATCH 095/134] hw/arm/omap1: " Alexander Graf
` (40 subsequent siblings)
134 siblings, 1 reply; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert memory_region_init*() calls that pass NULL owner to pass
the enclosing SoC device or machine instead.
Static helpers make_ram()/make_ram_alias() in mps2.c and mps2-tz.c,
create_tag_ram() in virt.c, and exynos4_boards_init_ram() gain an
Object *owner first argument. armsse.c:make_alias() and
aspeed_install_boot_rom() already carry a QOM-derived first
argument; use it.
hw/arm/omap1.c is handled in a separate commit as its 20+ non-QOM
sub-init helpers all need owner threading.
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/armsse.c | 8 ++++----
hw/arm/aspeed.c | 2 +-
hw/arm/aspeed_soc_common.c | 2 +-
hw/arm/exynos4210.c | 2 +-
hw/arm/exynos4_boards.c | 8 ++++----
hw/arm/fsl-imx25.c | 2 +-
hw/arm/fsl-imx31.c | 2 +-
hw/arm/fsl-imx6.c | 2 +-
hw/arm/fsl-imx6ul.c | 2 +-
hw/arm/fsl-imx7.c | 8 ++++----
hw/arm/imx25_pdk.c | 2 +-
hw/arm/integratorcp.c | 2 +-
hw/arm/kzm.c | 2 +-
hw/arm/max78000_soc.c | 2 +-
hw/arm/mps2-tz.c | 9 +++++----
hw/arm/mps2.c | 33 +++++++++++++++++----------------
hw/arm/mps3r.c | 4 ++--
hw/arm/msf2-soc.c | 2 +-
hw/arm/msf2-som.c | 2 +-
hw/arm/musca.c | 4 ++--
hw/arm/musicpal.c | 2 +-
hw/arm/omap_sx1.c | 14 +++++++-------
hw/arm/realview.c | 8 ++++----
hw/arm/sbsa-ref.c | 2 +-
hw/arm/stellaris.c | 4 ++--
hw/arm/stm32f100_soc.c | 2 +-
hw/arm/stm32f205_soc.c | 2 +-
hw/arm/stm32f405_soc.c | 4 ++--
hw/arm/vexpress.c | 8 ++++----
hw/arm/virt.c | 13 +++++++------
hw/arm/xilinx_zynq.c | 2 +-
hw/arm/xlnx-zynqmp.c | 2 +-
32 files changed, 83 insertions(+), 80 deletions(-)
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
index ddb210c895..81895ad370 100644
--- a/hw/arm/armsse.c
+++ b/hw/arm/armsse.c
@@ -620,7 +620,7 @@ static uint32_t armsse_sys_config_value(ARMSSE *s, const ARMSSEInfo *info)
static void make_alias(ARMSSE *s, MemoryRegion *mr, MemoryRegion *container,
const char *name, hwaddr base, hwaddr size, hwaddr orig)
{
- memory_region_init_alias(mr, NULL, name, container, orig, size);
+ memory_region_init_alias(mr, OBJECT(s), name, container, orig, size);
/* The alias is even lower priority than unimplemented_device regions */
memory_region_add_subregion_overlap(container, base, mr, -1500);
}
@@ -1161,7 +1161,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
SysBusDevice *sbd_mpc;
uint32_t sram_bank_size = 1 << s->sram_addr_width;
- memory_region_init_ram(&s->sram[i], NULL, ramname,
+ memory_region_init_ram(&s->sram[i], OBJECT(dev), ramname,
sram_bank_size, errp);
g_free(ramname);
if (*errp) {
@@ -1226,11 +1226,11 @@ static void armsse_realize(DeviceState *dev, Error **errp)
if (info->has_tcms) {
/* The SSE-300 has an ITCM at 0x0000_0000 and a DTCM at 0x2000_0000 */
- memory_region_init_ram(&s->itcm, NULL, "sse300-itcm", 512 * KiB, errp);
+ memory_region_init_ram(&s->itcm, OBJECT(dev), "sse300-itcm", 512 * KiB, errp);
if (*errp) {
return;
}
- memory_region_init_ram(&s->dtcm, NULL, "sse300-dtcm", 512 * KiB, errp);
+ memory_region_init_ram(&s->dtcm, OBJECT(dev), "sse300-dtcm", 512 * KiB, errp);
if (*errp) {
return;
}
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 2e76e09f8f..f9249a9851 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -201,7 +201,7 @@ static void aspeed_machine_init(MachineState *machine)
if (machine->kernel_filename && sc->num_cpus > 1) {
/* With no u-boot we must set up a boot stub for the secondary CPU */
MemoryRegion *smpboot = g_new(MemoryRegion, 1);
- memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
+ memory_region_init_ram(smpboot, OBJECT(bmc), "aspeed.smpboot",
0x80, &error_abort);
memory_region_add_subregion(get_system_memory(),
AST_SMP_MAILBOX_BASE, smpboot);
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
index 780a9659cc..c79b27c561 100644
--- a/hw/arm/aspeed_soc_common.c
+++ b/hw/arm/aspeed_soc_common.c
@@ -177,7 +177,7 @@ void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk,
{
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
- memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", rom_size,
+ memory_region_init_rom(boot_rom, OBJECT(soc), "aspeed.boot_rom", rom_size,
&error_abort);
memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
boot_rom, 1);
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
index 74ce36c1e6..676915e814 100644
--- a/hw/arm/exynos4210.c
+++ b/hw/arm/exynos4210.c
@@ -660,7 +660,7 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
&s->irom_alias_mem);
/* Internal RAM */
- memory_region_init_ram(&s->iram_mem, NULL, "exynos4210.iram",
+ memory_region_init_ram(&s->iram_mem, OBJECT(socdev), "exynos4210.iram",
EXYNOS4210_IRAM_SIZE, &error_fatal);
memory_region_add_subregion(system_mem, EXYNOS4210_IRAM_BASE_ADDR,
&s->iram_mem);
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index dce2c24860..8430317815 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -88,14 +88,14 @@ static void lan9215_init(uint32_t base, qemu_irq irq)
}
}
-static void exynos4_boards_init_ram(Exynos4BoardState *s,
+static void exynos4_boards_init_ram(Object *owner, Exynos4BoardState *s,
MemoryRegion *system_mem,
unsigned long ram_size)
{
unsigned long mem_size = ram_size;
if (mem_size > EXYNOS4210_DRAM_MAX_SIZE) {
- memory_region_init_ram(&s->dram1_mem, NULL, "exynos4210.dram1",
+ memory_region_init_ram(&s->dram1_mem, owner, "exynos4210.dram1",
mem_size - EXYNOS4210_DRAM_MAX_SIZE,
&error_fatal);
memory_region_add_subregion(system_mem, EXYNOS4210_DRAM1_BASE_ADDR,
@@ -103,7 +103,7 @@ static void exynos4_boards_init_ram(Exynos4BoardState *s,
mem_size = EXYNOS4210_DRAM_MAX_SIZE;
}
- memory_region_init_ram(&s->dram0_mem, NULL, "exynos4210.dram0", mem_size,
+ memory_region_init_ram(&s->dram0_mem, owner, "exynos4210.dram0", mem_size,
&error_fatal);
memory_region_add_subregion(system_mem, EXYNOS4210_DRAM0_BASE_ADDR,
&s->dram0_mem);
@@ -122,7 +122,7 @@ exynos4_boards_init_common(MachineState *machine,
exynos4_board_binfo.gic_cpu_if_addr =
EXYNOS4210_SMP_PRIVATE_BASE_ADDR + 0x100;
- exynos4_boards_init_ram(s, get_system_memory(),
+ exynos4_boards_init_ram(OBJECT(machine), s, get_system_memory(),
exynos4_board_ram_size[board_type]);
object_initialize_child(OBJECT(machine), "soc", &s->soc,
diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
index 7f65f4ca4b..f589c83567 100644
--- a/hw/arm/fsl-imx25.c
+++ b/hw/arm/fsl-imx25.c
@@ -292,7 +292,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
&s->rom[1]);
/* initialize internal RAM (128 KB) */
- if (!memory_region_init_ram(&s->iram, NULL, "imx25.iram",
+ if (!memory_region_init_ram(&s->iram, OBJECT(dev), "imx25.iram",
FSL_IMX25_IRAM_SIZE, errp)) {
return;
}
diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
index 190f863355..fc387bbbc3 100644
--- a/hw/arm/fsl-imx31.c
+++ b/hw/arm/fsl-imx31.c
@@ -204,7 +204,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
&s->rom);
/* initialize internal RAM (16 KB) */
- if (!memory_region_init_ram(&s->iram, NULL, "imx31.iram",
+ if (!memory_region_init_ram(&s->iram, OBJECT(dev), "imx31.iram",
FSL_IMX31_IRAM_SIZE, errp)) {
return;
}
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index f0fbdc1a68..99250910cb 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -491,7 +491,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
&s->caam);
/* OCRAM memory */
- if (!memory_region_init_ram(&s->ocram, NULL, "imx6.ocram",
+ if (!memory_region_init_ram(&s->ocram, OBJECT(dev), "imx6.ocram",
FSL_IMX6_OCRAM_SIZE, errp)) {
return;
}
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
index adbb896fd1..f830dce9df 100644
--- a/hw/arm/fsl-imx6ul.c
+++ b/hw/arm/fsl-imx6ul.c
@@ -699,7 +699,7 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
/*
* OCRAM memory
*/
- memory_region_init_ram(&s->ocram, NULL, "imx6ul.ocram",
+ memory_region_init_ram(&s->ocram, OBJECT(dev), "imx6ul.ocram",
FSL_IMX6UL_OCRAM_MEM_SIZE,
&error_abort);
memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_OCRAM_MEM_ADDR,
diff --git a/hw/arm/fsl-imx7.c b/hw/arm/fsl-imx7.c
index 07a5ae8cd0..ceb26b4efd 100644
--- a/hw/arm/fsl-imx7.c
+++ b/hw/arm/fsl-imx7.c
@@ -689,7 +689,7 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
/*
* OCRAM memory
*/
- memory_region_init_ram(&s->ocram, NULL, "imx7.ocram",
+ memory_region_init_ram(&s->ocram, OBJECT(dev), "imx7.ocram",
FSL_IMX7_OCRAM_MEM_SIZE,
&error_abort);
memory_region_add_subregion(get_system_memory(), FSL_IMX7_OCRAM_MEM_ADDR,
@@ -698,7 +698,7 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
/*
* OCRAM EPDC memory
*/
- memory_region_init_ram(&s->ocram_epdc, NULL, "imx7.ocram_epdc",
+ memory_region_init_ram(&s->ocram_epdc, OBJECT(dev), "imx7.ocram_epdc",
FSL_IMX7_OCRAM_EPDC_SIZE,
&error_abort);
memory_region_add_subregion(get_system_memory(), FSL_IMX7_OCRAM_EPDC_ADDR,
@@ -707,7 +707,7 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
/*
* OCRAM PXP memory
*/
- memory_region_init_ram(&s->ocram_pxp, NULL, "imx7.ocram_pxp",
+ memory_region_init_ram(&s->ocram_pxp, OBJECT(dev), "imx7.ocram_pxp",
FSL_IMX7_OCRAM_PXP_SIZE,
&error_abort);
memory_region_add_subregion(get_system_memory(), FSL_IMX7_OCRAM_PXP_ADDR,
@@ -716,7 +716,7 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
/*
* OCRAM_S memory
*/
- memory_region_init_ram(&s->ocram_s, NULL, "imx7.ocram_s",
+ memory_region_init_ram(&s->ocram_s, OBJECT(dev), "imx7.ocram_s",
FSL_IMX7_OCRAM_S_SIZE,
&error_abort);
memory_region_add_subregion(get_system_memory(), FSL_IMX7_OCRAM_S_ADDR,
diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c
index 9351d53850..cecfc25e9a 100644
--- a/hw/arm/imx25_pdk.c
+++ b/hw/arm/imx25_pdk.c
@@ -104,7 +104,7 @@ static void imx25_pdk_init(MachineState *machine)
ram_size -= size;
if (size < ram[i].size) {
- memory_region_init_alias(&s->ram_alias, NULL, "ram.alias",
+ memory_region_init_alias(&s->ram_alias, OBJECT(machine), "ram.alias",
machine->ram,
alias_offset, ram[i].size - size);
memory_region_add_subregion(get_system_memory(),
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index ed715a3eb8..81c0bce8f9 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -617,7 +617,7 @@ static void integratorcp_init(MachineState *machine)
/* SDRAM at address zero*/
memory_region_add_subregion(address_space_mem, 0, machine->ram);
/* And again at address 0x80000000 */
- memory_region_init_alias(ram_alias, NULL, "ram.alias", machine->ram,
+ memory_region_init_alias(ram_alias, OBJECT(machine), "ram.alias", machine->ram,
0, ram_size);
memory_region_add_subregion(address_space_mem, 0x80000000, ram_alias);
diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index 36e12bb362..3e879c492d 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -104,7 +104,7 @@ static void kzm_init(MachineState *machine)
ram_size -= size;
if (size < ram[i].size) {
- memory_region_init_alias(&s->ram_alias, NULL, "ram.alias",
+ memory_region_init_alias(&s->ram_alias, OBJECT(machine), "ram.alias",
machine->ram,
alias_offset, ram[i].size - size);
memory_region_add_subregion(get_system_memory(),
diff --git a/hw/arm/max78000_soc.c b/hw/arm/max78000_soc.c
index b8e0265de2..41cfaee925 100644
--- a/hw/arm/max78000_soc.c
+++ b/hw/arm/max78000_soc.c
@@ -74,7 +74,7 @@ static void max78000_soc_realize(DeviceState *dev_soc, Error **errp)
memory_region_add_subregion(system_memory, FLASH_BASE_ADDRESS, &s->flash);
- memory_region_init_ram(&s->sram, NULL, "MAX78000.sram", SRAM_SIZE,
+ memory_region_init_ram(&s->sram, obj, "MAX78000.sram", SRAM_SIZE,
&err);
gcrdev = DEVICE(&s->gcr);
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
index 32e3db1134..a57915e208 100644
--- a/hw/arm/mps2-tz.c
+++ b/hw/arm/mps2-tz.c
@@ -338,7 +338,7 @@ static MemoryRegion *mr_for_raminfo(MPS2TZMachineState *mms,
assert(raminfo->mrindex < MPS2TZ_RAM_MAX);
ram = &mms->ram[raminfo->mrindex];
- memory_region_init_ram(ram, NULL, raminfo->name,
+ memory_region_init_ram(ram, OBJECT(mms), raminfo->name,
raminfo->size, &error_fatal);
if (raminfo->flags & IS_ROM) {
memory_region_set_readonly(ram, true);
@@ -349,10 +349,10 @@ static MemoryRegion *mr_for_raminfo(MPS2TZMachineState *mms,
/* Create an alias of an entire original MemoryRegion @orig
* located at @base in the memory map.
*/
-static void make_ram_alias(MemoryRegion *mr, const char *name,
+static void make_ram_alias(Object *owner, MemoryRegion *mr, const char *name,
MemoryRegion *orig, hwaddr base)
{
- memory_region_init_alias(mr, NULL, name, orig, 0,
+ memory_region_init_alias(mr, owner, name, orig, 0,
memory_region_size(orig));
memory_region_add_subregion(get_system_memory(), base, mr);
}
@@ -767,7 +767,8 @@ static void create_non_mpc_ram(MPS2TZMachineState *mms)
if (p->flags & IS_ALIAS) {
SysBusDevice *mpc_sbd = SYS_BUS_DEVICE(&mms->mpc[p->mpc]);
MemoryRegion *upstream = sysbus_mmio_get_region(mpc_sbd, 1);
- make_ram_alias(&mms->ram[p->mrindex], p->name, upstream, p->base);
+ make_ram_alias(OBJECT(mms), &mms->ram[p->mrindex], p->name,
+ upstream, p->base);
} else if (p->mpc == -1) {
/* RAM not behind an MPC */
MemoryRegion *mr = mr_for_raminfo(mms, p);
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
index 23a814e4e4..1dec4a5d4d 100644
--- a/hw/arm/mps2.c
+++ b/hw/arm/mps2.c
@@ -115,20 +115,20 @@ OBJECT_DECLARE_TYPE(MPS2MachineState, MPS2MachineClass, MPS2_MACHINE)
/* Initialize the auxiliary RAM region @mr and map it into
* the memory map at @base.
*/
-static void make_ram(MemoryRegion *mr, const char *name,
+static void make_ram(Object *owner, MemoryRegion *mr, const char *name,
hwaddr base, hwaddr size)
{
- memory_region_init_ram(mr, NULL, name, size, &error_fatal);
+ memory_region_init_ram(mr, owner, name, size, &error_fatal);
memory_region_add_subregion(get_system_memory(), base, mr);
}
/* Create an alias of an entire original MemoryRegion @orig
* located at @base in the memory map.
*/
-static void make_ram_alias(MemoryRegion *mr, const char *name,
+static void make_ram_alias(Object *owner, MemoryRegion *mr, const char *name,
MemoryRegion *orig, hwaddr base)
{
- memory_region_init_alias(mr, NULL, name, orig, 0,
+ memory_region_init_alias(mr, owner, name, orig, 0,
memory_region_size(orig));
memory_region_add_subregion(get_system_memory(), base, mr);
}
@@ -192,12 +192,12 @@ static void mps2_common_init(MachineState *machine)
memory_region_add_subregion(system_memory, mmc->psram_base, machine->ram);
if (mmc->has_block_ram) {
- make_ram(&mms->blockram, "mps.blockram", 0x01000000, 0x4000);
- make_ram_alias(&mms->blockram_m1, "mps.blockram_m1",
+ make_ram(obj, &mms->blockram, "mps.blockram", 0x01000000, 0x4000);
+ make_ram_alias(obj, &mms->blockram_m1, "mps.blockram_m1",
&mms->blockram, 0x01004000);
- make_ram_alias(&mms->blockram_m2, "mps.blockram_m2",
+ make_ram_alias(obj, &mms->blockram_m2, "mps.blockram_m2",
&mms->blockram, 0x01008000);
- make_ram_alias(&mms->blockram_m3, "mps.blockram_m3",
+ make_ram_alias(obj, &mms->blockram_m3, "mps.blockram_m3",
&mms->blockram, 0x0100c000);
}
@@ -205,17 +205,18 @@ static void mps2_common_init(MachineState *machine)
case FPGA_AN385:
case FPGA_AN386:
case FPGA_AN500:
- make_ram(&mms->ssram1, "mps.ssram1", 0x0, 0x400000);
- make_ram_alias(&mms->ssram1_m, "mps.ssram1_m", &mms->ssram1, 0x400000);
- make_ram(&mms->ssram23, "mps.ssram23", 0x20000000, 0x400000);
- make_ram_alias(&mms->ssram23_m, "mps.ssram23_m",
+ make_ram(obj, &mms->ssram1, "mps.ssram1", 0x0, 0x400000);
+ make_ram_alias(obj, &mms->ssram1_m, "mps.ssram1_m",
+ &mms->ssram1, 0x400000);
+ make_ram(obj, &mms->ssram23, "mps.ssram23", 0x20000000, 0x400000);
+ make_ram_alias(obj, &mms->ssram23_m, "mps.ssram23_m",
&mms->ssram23, 0x20400000);
break;
case FPGA_AN511:
- make_ram(&mms->blockram, "mps.blockram", 0x0, 0x40000);
- make_ram(&mms->ssram1, "mps.ssram1", 0x00400000, 0x00800000);
- make_ram(&mms->sram, "mps.sram", 0x20000000, 0x20000);
- make_ram(&mms->ssram23, "mps.ssram23", 0x20400000, 0x400000);
+ make_ram(obj, &mms->blockram, "mps.blockram", 0x0, 0x40000);
+ make_ram(obj, &mms->ssram1, "mps.ssram1", 0x00400000, 0x00800000);
+ make_ram(obj, &mms->sram, "mps.sram", 0x20000000, 0x20000);
+ make_ram(obj, &mms->ssram23, "mps.ssram23", 0x20400000, 0x400000);
break;
default:
g_assert_not_reached();
diff --git a/hw/arm/mps3r.c b/hw/arm/mps3r.c
index 4d432de6ba..d6c29c1172 100644
--- a/hw/arm/mps3r.c
+++ b/hw/arm/mps3r.c
@@ -215,7 +215,7 @@ static MemoryRegion *mr_for_raminfo(MPS3RMachineState *mms,
assert(raminfo->mrindex < MPS3R_RAM_MAX);
ram = &mms->ram[raminfo->mrindex];
- memory_region_init_ram(ram, NULL, raminfo->name,
+ memory_region_init_ram(ram, OBJECT(mms), raminfo->name,
raminfo->size, &error_fatal);
if (raminfo->flags & IS_ROM) {
memory_region_set_readonly(ram, true);
@@ -397,7 +397,7 @@ static void mps3r_common_init(MachineState *machine)
object_unref(mms->cpu[i]);
/* Per-CPU RAM */
- memory_region_init_ram(&mms->cpu_ram[i], NULL, ramname,
+ memory_region_init_ram(&mms->cpu_ram[i], OBJECT(mms), ramname,
0x1000, &error_fatal);
memory_region_add_subregion(&mms->cpu_sysmem[i], 0xe7c01000,
&mms->cpu_ram[i]);
diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
index c03778c439..ce320a5a38 100644
--- a/hw/arm/msf2-soc.c
+++ b/hw/arm/msf2-soc.c
@@ -128,7 +128,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
memory_region_add_subregion(system_memory, ENVM_BASE_ADDRESS, &s->nvm);
memory_region_add_subregion(system_memory, 0, &s->nvm_alias);
- memory_region_init_ram(&s->sram, NULL, "MSF2.eSRAM", s->esram_size,
+ memory_region_init_ram(&s->sram, OBJECT(dev_soc), "MSF2.eSRAM", s->esram_size,
&error_fatal);
memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, &s->sram);
diff --git a/hw/arm/msf2-som.c b/hw/arm/msf2-som.c
index 0d0e2514dd..5493f1cf70 100644
--- a/hw/arm/msf2-som.c
+++ b/hw/arm/msf2-som.c
@@ -55,7 +55,7 @@ static void emcraft_sf2_s2s010_init(MachineState *machine)
MemoryRegion *ddr = g_new(MemoryRegion, 1);
Clock *m3clk;
- memory_region_init_ram(ddr, NULL, "ddr-ram", DDR_SIZE,
+ memory_region_init_ram(ddr, OBJECT(machine), "ddr-ram", DDR_SIZE,
&error_fatal);
memory_region_add_subregion(sysmem, DDR_BASE_ADDRESS, ddr);
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
index 75d82eebca..38eac4af76 100644
--- a/hw/arm/musca.c
+++ b/hw/arm/musca.c
@@ -235,12 +235,12 @@ static MemoryRegion *make_mpc(MuscaMachineState *mms, void *opaque,
switch (mpcinfo[i].type) {
case MPC_ROM:
downstream = &mms->ram[i];
- memory_region_init_rom(downstream, NULL, mpcinfo[i].name,
+ memory_region_init_rom(downstream, OBJECT(mms), mpcinfo[i].name,
mpcinfo[i].size, &error_fatal);
break;
case MPC_RAM:
downstream = &mms->ram[i];
- memory_region_init_ram(downstream, NULL, mpcinfo[i].name,
+ memory_region_init_ram(downstream, OBJECT(mms), mpcinfo[i].name,
mpcinfo[i].size, &error_fatal);
break;
case MPC_CRYPTOISLAND:
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index 86ea348d3d..fda42f71d5 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1236,7 +1236,7 @@ static void musicpal_init(MachineState *machine)
memory_region_add_subregion(address_space_mem, 0, machine->ram);
- memory_region_init_ram(sram, NULL, "musicpal.sram", MP_SRAM_SIZE,
+ memory_region_init_ram(sram, OBJECT(machine), "musicpal.sram", MP_SRAM_SIZE,
&error_fatal);
memory_region_add_subregion(address_space_mem, MP_SRAM_BASE, sram);
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
index 1bd6c6d4bc..f8d54c2716 100644
--- a/hw/arm/omap_sx1.c
+++ b/hw/arm/omap_sx1.c
@@ -128,22 +128,22 @@ static void sx1_init(MachineState *machine, const int version)
mpu = omap310_mpu_init(OBJECT(machine), machine->ram, machine->cpu_type);
/* External Flash (EMIFS) */
- memory_region_init_rom(flash, NULL, "omap_sx1.flash0-0", flash_size,
+ memory_region_init_rom(flash, OBJECT(machine), "omap_sx1.flash0-0", flash_size,
&error_fatal);
memory_region_add_subregion(address_space, OMAP_CS0_BASE, flash);
- memory_region_init_io(&cs[0], NULL, &static_ops, &cs0val,
+ memory_region_init_io(&cs[0], OBJECT(machine), &static_ops, &cs0val,
"sx1.cs0", OMAP_CS0_SIZE - flash_size);
memory_region_add_subregion(address_space,
OMAP_CS0_BASE + flash_size, &cs[0]);
- memory_region_init_io(&cs[2], NULL, &static_ops, &cs2val,
+ memory_region_init_io(&cs[2], OBJECT(machine), &static_ops, &cs2val,
"sx1.cs2", OMAP_CS2_SIZE);
memory_region_add_subregion(address_space,
OMAP_CS2_BASE, &cs[2]);
- memory_region_init_io(&cs[3], NULL, &static_ops, &cs3val,
+ memory_region_init_io(&cs[3], OBJECT(machine), &static_ops, &cs3val,
"sx1.cs3", OMAP_CS3_SIZE);
memory_region_add_subregion(address_space,
OMAP_CS3_BASE, &cs[3]);
@@ -160,11 +160,11 @@ static void sx1_init(MachineState *machine, const int version)
if ((version == 1) &&
(dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
MemoryRegion *flash_1 = g_new(MemoryRegion, 1);
- memory_region_init_rom(flash_1, NULL, "omap_sx1.flash1-0",
+ memory_region_init_rom(flash_1, OBJECT(machine), "omap_sx1.flash1-0",
FLASH1_SIZE, &error_fatal);
memory_region_add_subregion(address_space, OMAP_CS1_BASE, flash_1);
- memory_region_init_io(&cs[1], NULL, &static_ops, &cs1val,
+ memory_region_init_io(&cs[1], OBJECT(machine), &static_ops, &cs1val,
"sx1.cs1", OMAP_CS1_SIZE - FLASH1_SIZE);
memory_region_add_subregion(address_space,
OMAP_CS1_BASE + FLASH1_SIZE, &cs[1]);
@@ -175,7 +175,7 @@ static void sx1_init(MachineState *machine, const int version)
SECTOR_SIZE, 4, 0, 0, 0, 0, 0);
fl_idx++;
} else {
- memory_region_init_io(&cs[1], NULL, &static_ops, &cs1val,
+ memory_region_init_io(&cs[1], OBJECT(machine), &static_ops, &cs1val,
"sx1.cs1", OMAP_CS1_SIZE);
memory_region_add_subregion(address_space,
OMAP_CS1_BASE, &cs[1]);
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index 2441137222..73bfffa6e6 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -159,18 +159,18 @@ static void realview_init(MachineState *machine,
ram_lo = g_new(MemoryRegion, 1);
low_ram_size = ram_size - 0x20000000;
ram_size = 0x20000000;
- memory_region_init_ram(ram_lo, NULL, "realview.lowmem", low_ram_size,
+ memory_region_init_ram(ram_lo, OBJECT(machine), "realview.lowmem", low_ram_size,
&error_fatal);
memory_region_add_subregion(sysmem, 0x20000000, ram_lo);
}
- memory_region_init_ram(ram_hi, NULL, "realview.highmem", ram_size,
+ memory_region_init_ram(ram_hi, OBJECT(machine), "realview.highmem", ram_size,
&error_fatal);
low_ram_size = ram_size;
if (low_ram_size > 0x10000000)
low_ram_size = 0x10000000;
/* SDRAM at address zero. */
- memory_region_init_alias(ram_alias, NULL, "realview.alias",
+ memory_region_init_alias(ram_alias, OBJECT(machine), "realview.alias",
ram_hi, 0, low_ram_size);
memory_region_add_subregion(sysmem, 0, ram_alias);
if (is_pb) {
@@ -396,7 +396,7 @@ static void realview_init(MachineState *machine,
startup code. I guess this works on real hardware because the
BootROM happens to be in ROM/flash or in memory that isn't clobbered
until after Linux boots the secondary CPUs. */
- memory_region_init_ram(ram_hack, NULL, "realview.hack", 0x1000,
+ memory_region_init_ram(ram_hack, OBJECT(machine), "realview.hack", 0x1000,
&error_fatal);
memory_region_add_subregion(sysmem, SMP_BOOT_ADDR, ram_hack);
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
index f632df742b..c9adc972c1 100644
--- a/hw/arm/sbsa-ref.c
+++ b/hw/arm/sbsa-ref.c
@@ -410,7 +410,7 @@ static void create_secure_ram(SBSAMachineState *sms,
hwaddr base = sbsa_ref_memmap[SBSA_SECURE_MEM].base;
hwaddr size = sbsa_ref_memmap[SBSA_SECURE_MEM].size;
- memory_region_init_ram(secram, NULL, "sbsa-ref.secure-ram", size,
+ memory_region_init_ram(secram, OBJECT(sms), "sbsa-ref.secure-ram", size,
&error_fatal);
memory_region_add_subregion(secure_sysmem, base, secram);
}
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index 6a732a3c11..1bc428e063 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1084,11 +1084,11 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
object_property_add_child(OBJECT(ms), "soc", soc_container);
/* Flash programming is done via the SCU, so pretend it is ROM. */
- memory_region_init_rom(flash, NULL, "stellaris.flash", flash_size,
+ memory_region_init_rom(flash, OBJECT(ms), "stellaris.flash", flash_size,
&error_fatal);
memory_region_add_subregion(system_memory, 0, flash);
- memory_region_init_ram(sram, NULL, "stellaris.sram", sram_size,
+ memory_region_init_ram(sram, OBJECT(ms), "stellaris.sram", sram_size,
&error_fatal);
memory_region_add_subregion(system_memory, 0x20000000, sram);
diff --git a/hw/arm/stm32f100_soc.c b/hw/arm/stm32f100_soc.c
index e9e722f359..d6d81c1338 100644
--- a/hw/arm/stm32f100_soc.c
+++ b/hw/arm/stm32f100_soc.c
@@ -108,7 +108,7 @@ static void stm32f100_soc_realize(DeviceState *dev_soc, Error **errp)
memory_region_add_subregion(system_memory, 0, &s->flash_alias);
/* Init SRAM region */
- memory_region_init_ram(&s->sram, NULL, "STM32F100.sram", SRAM_SIZE,
+ memory_region_init_ram(&s->sram, OBJECT(dev_soc), "STM32F100.sram", SRAM_SIZE,
&error_fatal);
memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, &s->sram);
diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
index a03c6b4002..2997e7d777 100644
--- a/hw/arm/stm32f205_soc.c
+++ b/hw/arm/stm32f205_soc.c
@@ -121,7 +121,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
memory_region_add_subregion(system_memory, FLASH_BASE_ADDRESS, &s->flash);
memory_region_add_subregion(system_memory, 0, &s->flash_alias);
- memory_region_init_ram(&s->sram, NULL, "STM32F205.sram", SRAM_SIZE,
+ memory_region_init_ram(&s->sram, OBJECT(dev_soc), "STM32F205.sram", SRAM_SIZE,
&error_fatal);
memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, &s->sram);
diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
index dc9b3053a5..4783f3f64a 100644
--- a/hw/arm/stm32f405_soc.c
+++ b/hw/arm/stm32f405_soc.c
@@ -134,7 +134,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
memory_region_add_subregion(system_memory, FLASH_BASE_ADDRESS, &s->flash);
memory_region_add_subregion(system_memory, 0, &s->flash_alias);
- memory_region_init_ram(&s->sram, NULL, "STM32F405.sram", SRAM_SIZE,
+ memory_region_init_ram(&s->sram, OBJECT(dev_soc), "STM32F405.sram", SRAM_SIZE,
&err);
if (err != NULL) {
error_propagate(errp, err);
@@ -142,7 +142,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
}
memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, &s->sram);
- memory_region_init_ram(&s->ccm, NULL, "STM32F405.ccm", CCM_SIZE,
+ memory_region_init_ram(&s->ccm, OBJECT(dev_soc), "STM32F405.ccm", CCM_SIZE,
&err);
if (err != NULL) {
error_propagate(errp, err);
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index a643c6b079..f877ccf330 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -392,7 +392,7 @@ static void a15_daughterboard_init(VexpressMachineState *vms,
/* 0x2b060000: SP805 watchdog: not modelled */
/* 0x2b0a0000: PL341 dynamic memory controller: not modelled */
/* 0x2e000000: system SRAM */
- memory_region_init_ram(&vms->a15sram, NULL, "vexpress.a15sram", 0x10000,
+ memory_region_init_ram(&vms->a15sram, OBJECT(vms), "vexpress.a15sram", 0x10000,
&error_fatal);
memory_region_add_subregion(sysmem, 0x2e000000, &vms->a15sram);
@@ -677,7 +677,7 @@ static void vexpress_common_init(MachineState *machine)
/* Map flash 0 as an alias into low memory */
MemoryRegion *flash0mem;
flash0mem = sysbus_mmio_get_region(SYS_BUS_DEVICE(pflash0), 0);
- memory_region_init_alias(&vms->flashalias, NULL, "vexpress.flashalias",
+ memory_region_init_alias(&vms->flashalias, OBJECT(vms), "vexpress.flashalias",
flash0mem, 0, VEXPRESS_FLASH_SIZE);
memory_region_add_subregion(sysmem, map[VE_NORFLASHALIAS], &vms->flashalias);
}
@@ -687,12 +687,12 @@ static void vexpress_common_init(MachineState *machine)
"vexpress.flash1", dinfo);
sram_size = 0x2000000;
- memory_region_init_ram(&vms->sram, NULL, "vexpress.sram", sram_size,
+ memory_region_init_ram(&vms->sram, OBJECT(vms), "vexpress.sram", sram_size,
&error_fatal);
memory_region_add_subregion(sysmem, map[VE_SRAM], &vms->sram);
vram_size = 0x800000;
- memory_region_init_ram(&vms->vram, NULL, "vexpress.vram", vram_size,
+ memory_region_init_ram(&vms->vram, OBJECT(vms), "vexpress.vram", vram_size,
&error_fatal);
memory_region_add_subregion(sysmem, map[VE_VIDEORAM], &vms->vram);
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index ea51a5f3bd..f2249a0b72 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2308,13 +2308,13 @@ static void create_platform_bus(VirtMachineState *vms)
sysbus_mmio_get_region(s, 0));
}
-static void create_tag_ram(MemoryRegion *tag_sysmem,
+static void create_tag_ram(Object *owner, MemoryRegion *tag_sysmem,
hwaddr base, hwaddr size,
const char *name)
{
MemoryRegion *tagram = g_new(MemoryRegion, 1);
- memory_region_init_ram(tagram, NULL, name, size / 32, &error_fatal);
+ memory_region_init_ram(tagram, owner, name, size / 32, &error_fatal);
memory_region_add_subregion(tag_sysmem, base / 32, tagram);
}
@@ -2328,7 +2328,7 @@ static void create_secure_ram(VirtMachineState *vms,
hwaddr size = vms->memmap[VIRT_SECURE_MEM].size;
MachineState *ms = MACHINE(vms);
- memory_region_init_ram(secram, NULL, "virt.secure-ram", size,
+ memory_region_init_ram(secram, OBJECT(vms), "virt.secure-ram", size,
&error_fatal);
memory_region_add_subregion(secure_sysmem, base, secram);
@@ -2340,7 +2340,8 @@ static void create_secure_ram(VirtMachineState *vms,
qemu_fdt_setprop_string(ms->fdt, nodename, "secure-status", "okay");
if (secure_tag_sysmem) {
- create_tag_ram(secure_tag_sysmem, base, size, "mach-virt.secure-tag");
+ create_tag_ram(OBJECT(vms), secure_tag_sysmem, base, size,
+ "mach-virt.secure-tag");
}
g_free(nodename);
@@ -2840,7 +2841,7 @@ static void virt_post_cpus_gic_realized(VirtMachineState *vms,
exit(1);
}
- memory_region_init_ram(pvtime, NULL, "pvtime", pvtime_size, NULL);
+ memory_region_init_ram(pvtime, OBJECT(vms), "pvtime", pvtime_size, NULL);
memory_region_add_subregion(sysmem, pvtime_reg_base, pvtime);
}
if (!aarch64 && vms->virt) {
@@ -3200,7 +3201,7 @@ static void machvirt_init(MachineState *machine)
}
if (tag_sysmem) {
- create_tag_ram(tag_sysmem, vms->memmap[VIRT_MEM].base,
+ create_tag_ram(OBJECT(vms), tag_sysmem, vms->memmap[VIRT_MEM].base,
machine->ram_size, "mach-virt.tag");
}
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 30f0ce5b5f..441289e63f 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -238,7 +238,7 @@ static void zynq_init(MachineState *machine)
memory_region_add_subregion(address_space_mem, 0, machine->ram);
/* 256K of on-chip memory */
- memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 * KiB,
+ memory_region_init_ram(ocm_ram, OBJECT(machine), "zynq.ocm_ram", 256 * KiB,
&error_fatal);
memory_region_add_subregion(address_space_mem, 0xFFFC0000, ocm_ram);
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index e4a10861a8..a25d5d3158 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -510,7 +510,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
for (i = 0; i < XLNX_ZYNQMP_NUM_OCM_BANKS; i++) {
char *ocm_name = g_strdup_printf("zynqmp.ocm_ram_bank_%d", i);
- memory_region_init_ram(&s->ocm_ram[i], NULL, ocm_name,
+ memory_region_init_ram(&s->ocm_ram[i], OBJECT(dev), ocm_name,
XLNX_ZYNQMP_OCM_RAM_SIZE, &error_fatal);
memory_region_add_subregion(get_system_memory(),
XLNX_ZYNQMP_OCM_RAM_0_ADDRESS +
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 094/134] hw/arm: Give memory regions an explicit owner
2026-07-11 22:36 ` [RFC PATCH 094/134] hw/arm: " Alexander Graf
@ 2026-07-12 15:12 ` Bernhard Beschow
0 siblings, 0 replies; 156+ messages in thread
From: Bernhard Beschow @ 2026-07-12 15:12 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Stafford Horne, Sergio Lopez,
Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Am 11. Juli 2026 22:36:27 UTC schrieb Alexander Graf <graf@amazon.com>:
>Convert memory_region_init*() calls that pass NULL owner to pass
>the enclosing SoC device or machine instead.
>
>Static helpers make_ram()/make_ram_alias() in mps2.c and mps2-tz.c,
>create_tag_ram() in virt.c, and exynos4_boards_init_ram() gain an
>Object *owner first argument. armsse.c:make_alias() and
>aspeed_install_boot_rom() already carry a QOM-derived first
>argument; use it.
>
>hw/arm/omap1.c is handled in a separate commit as its 20+ non-QOM
>sub-init helpers all need owner threading.
>
>No functional change intended.
>
>Assisted-by: Kiro
>Signed-off-by: Alexander Graf <graf@amazon.com>
For the imx machines we don't care about migration compatibility, so:
Reviewed-by: Bernhard Beschow <shentey@gmail.com>
>---
> hw/arm/armsse.c | 8 ++++----
> hw/arm/aspeed.c | 2 +-
> hw/arm/aspeed_soc_common.c | 2 +-
> hw/arm/exynos4210.c | 2 +-
> hw/arm/exynos4_boards.c | 8 ++++----
> hw/arm/fsl-imx25.c | 2 +-
> hw/arm/fsl-imx31.c | 2 +-
> hw/arm/fsl-imx6.c | 2 +-
> hw/arm/fsl-imx6ul.c | 2 +-
> hw/arm/fsl-imx7.c | 8 ++++----
> hw/arm/imx25_pdk.c | 2 +-
> hw/arm/integratorcp.c | 2 +-
> hw/arm/kzm.c | 2 +-
> hw/arm/max78000_soc.c | 2 +-
> hw/arm/mps2-tz.c | 9 +++++----
> hw/arm/mps2.c | 33 +++++++++++++++++----------------
> hw/arm/mps3r.c | 4 ++--
> hw/arm/msf2-soc.c | 2 +-
> hw/arm/msf2-som.c | 2 +-
> hw/arm/musca.c | 4 ++--
> hw/arm/musicpal.c | 2 +-
> hw/arm/omap_sx1.c | 14 +++++++-------
> hw/arm/realview.c | 8 ++++----
> hw/arm/sbsa-ref.c | 2 +-
> hw/arm/stellaris.c | 4 ++--
> hw/arm/stm32f100_soc.c | 2 +-
> hw/arm/stm32f205_soc.c | 2 +-
> hw/arm/stm32f405_soc.c | 4 ++--
> hw/arm/vexpress.c | 8 ++++----
> hw/arm/virt.c | 13 +++++++------
> hw/arm/xilinx_zynq.c | 2 +-
> hw/arm/xlnx-zynqmp.c | 2 +-
> 32 files changed, 83 insertions(+), 80 deletions(-)
>
>diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
>index ddb210c895..81895ad370 100644
>--- a/hw/arm/armsse.c
>+++ b/hw/arm/armsse.c
>@@ -620,7 +620,7 @@ static uint32_t armsse_sys_config_value(ARMSSE *s, const ARMSSEInfo *info)
> static void make_alias(ARMSSE *s, MemoryRegion *mr, MemoryRegion *container,
> const char *name, hwaddr base, hwaddr size, hwaddr orig)
> {
>- memory_region_init_alias(mr, NULL, name, container, orig, size);
>+ memory_region_init_alias(mr, OBJECT(s), name, container, orig, size);
> /* The alias is even lower priority than unimplemented_device regions */
> memory_region_add_subregion_overlap(container, base, mr, -1500);
> }
>@@ -1161,7 +1161,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
> SysBusDevice *sbd_mpc;
> uint32_t sram_bank_size = 1 << s->sram_addr_width;
>
>- memory_region_init_ram(&s->sram[i], NULL, ramname,
>+ memory_region_init_ram(&s->sram[i], OBJECT(dev), ramname,
> sram_bank_size, errp);
> g_free(ramname);
> if (*errp) {
>@@ -1226,11 +1226,11 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>
> if (info->has_tcms) {
> /* The SSE-300 has an ITCM at 0x0000_0000 and a DTCM at 0x2000_0000 */
>- memory_region_init_ram(&s->itcm, NULL, "sse300-itcm", 512 * KiB, errp);
>+ memory_region_init_ram(&s->itcm, OBJECT(dev), "sse300-itcm", 512 * KiB, errp);
> if (*errp) {
> return;
> }
>- memory_region_init_ram(&s->dtcm, NULL, "sse300-dtcm", 512 * KiB, errp);
>+ memory_region_init_ram(&s->dtcm, OBJECT(dev), "sse300-dtcm", 512 * KiB, errp);
> if (*errp) {
> return;
> }
>diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
>index 2e76e09f8f..f9249a9851 100644
>--- a/hw/arm/aspeed.c
>+++ b/hw/arm/aspeed.c
>@@ -201,7 +201,7 @@ static void aspeed_machine_init(MachineState *machine)
> if (machine->kernel_filename && sc->num_cpus > 1) {
> /* With no u-boot we must set up a boot stub for the secondary CPU */
> MemoryRegion *smpboot = g_new(MemoryRegion, 1);
>- memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
>+ memory_region_init_ram(smpboot, OBJECT(bmc), "aspeed.smpboot",
> 0x80, &error_abort);
> memory_region_add_subregion(get_system_memory(),
> AST_SMP_MAILBOX_BASE, smpboot);
>diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
>index 780a9659cc..c79b27c561 100644
>--- a/hw/arm/aspeed_soc_common.c
>+++ b/hw/arm/aspeed_soc_common.c
>@@ -177,7 +177,7 @@ void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk,
> {
> AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
>
>- memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", rom_size,
>+ memory_region_init_rom(boot_rom, OBJECT(soc), "aspeed.boot_rom", rom_size,
> &error_abort);
> memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
> boot_rom, 1);
>diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
>index 74ce36c1e6..676915e814 100644
>--- a/hw/arm/exynos4210.c
>+++ b/hw/arm/exynos4210.c
>@@ -660,7 +660,7 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
> &s->irom_alias_mem);
>
> /* Internal RAM */
>- memory_region_init_ram(&s->iram_mem, NULL, "exynos4210.iram",
>+ memory_region_init_ram(&s->iram_mem, OBJECT(socdev), "exynos4210.iram",
> EXYNOS4210_IRAM_SIZE, &error_fatal);
> memory_region_add_subregion(system_mem, EXYNOS4210_IRAM_BASE_ADDR,
> &s->iram_mem);
>diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
>index dce2c24860..8430317815 100644
>--- a/hw/arm/exynos4_boards.c
>+++ b/hw/arm/exynos4_boards.c
>@@ -88,14 +88,14 @@ static void lan9215_init(uint32_t base, qemu_irq irq)
> }
> }
>
>-static void exynos4_boards_init_ram(Exynos4BoardState *s,
>+static void exynos4_boards_init_ram(Object *owner, Exynos4BoardState *s,
> MemoryRegion *system_mem,
> unsigned long ram_size)
> {
> unsigned long mem_size = ram_size;
>
> if (mem_size > EXYNOS4210_DRAM_MAX_SIZE) {
>- memory_region_init_ram(&s->dram1_mem, NULL, "exynos4210.dram1",
>+ memory_region_init_ram(&s->dram1_mem, owner, "exynos4210.dram1",
> mem_size - EXYNOS4210_DRAM_MAX_SIZE,
> &error_fatal);
> memory_region_add_subregion(system_mem, EXYNOS4210_DRAM1_BASE_ADDR,
>@@ -103,7 +103,7 @@ static void exynos4_boards_init_ram(Exynos4BoardState *s,
> mem_size = EXYNOS4210_DRAM_MAX_SIZE;
> }
>
>- memory_region_init_ram(&s->dram0_mem, NULL, "exynos4210.dram0", mem_size,
>+ memory_region_init_ram(&s->dram0_mem, owner, "exynos4210.dram0", mem_size,
> &error_fatal);
> memory_region_add_subregion(system_mem, EXYNOS4210_DRAM0_BASE_ADDR,
> &s->dram0_mem);
>@@ -122,7 +122,7 @@ exynos4_boards_init_common(MachineState *machine,
> exynos4_board_binfo.gic_cpu_if_addr =
> EXYNOS4210_SMP_PRIVATE_BASE_ADDR + 0x100;
>
>- exynos4_boards_init_ram(s, get_system_memory(),
>+ exynos4_boards_init_ram(OBJECT(machine), s, get_system_memory(),
> exynos4_board_ram_size[board_type]);
>
> object_initialize_child(OBJECT(machine), "soc", &s->soc,
>diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
>index 7f65f4ca4b..f589c83567 100644
>--- a/hw/arm/fsl-imx25.c
>+++ b/hw/arm/fsl-imx25.c
>@@ -292,7 +292,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
> &s->rom[1]);
>
> /* initialize internal RAM (128 KB) */
>- if (!memory_region_init_ram(&s->iram, NULL, "imx25.iram",
>+ if (!memory_region_init_ram(&s->iram, OBJECT(dev), "imx25.iram",
> FSL_IMX25_IRAM_SIZE, errp)) {
> return;
> }
>diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
>index 190f863355..fc387bbbc3 100644
>--- a/hw/arm/fsl-imx31.c
>+++ b/hw/arm/fsl-imx31.c
>@@ -204,7 +204,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
> &s->rom);
>
> /* initialize internal RAM (16 KB) */
>- if (!memory_region_init_ram(&s->iram, NULL, "imx31.iram",
>+ if (!memory_region_init_ram(&s->iram, OBJECT(dev), "imx31.iram",
> FSL_IMX31_IRAM_SIZE, errp)) {
> return;
> }
>diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
>index f0fbdc1a68..99250910cb 100644
>--- a/hw/arm/fsl-imx6.c
>+++ b/hw/arm/fsl-imx6.c
>@@ -491,7 +491,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
> &s->caam);
>
> /* OCRAM memory */
>- if (!memory_region_init_ram(&s->ocram, NULL, "imx6.ocram",
>+ if (!memory_region_init_ram(&s->ocram, OBJECT(dev), "imx6.ocram",
> FSL_IMX6_OCRAM_SIZE, errp)) {
> return;
> }
>diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
>index adbb896fd1..f830dce9df 100644
>--- a/hw/arm/fsl-imx6ul.c
>+++ b/hw/arm/fsl-imx6ul.c
>@@ -699,7 +699,7 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
> /*
> * OCRAM memory
> */
>- memory_region_init_ram(&s->ocram, NULL, "imx6ul.ocram",
>+ memory_region_init_ram(&s->ocram, OBJECT(dev), "imx6ul.ocram",
> FSL_IMX6UL_OCRAM_MEM_SIZE,
> &error_abort);
> memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_OCRAM_MEM_ADDR,
>diff --git a/hw/arm/fsl-imx7.c b/hw/arm/fsl-imx7.c
>index 07a5ae8cd0..ceb26b4efd 100644
>--- a/hw/arm/fsl-imx7.c
>+++ b/hw/arm/fsl-imx7.c
>@@ -689,7 +689,7 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
> /*
> * OCRAM memory
> */
>- memory_region_init_ram(&s->ocram, NULL, "imx7.ocram",
>+ memory_region_init_ram(&s->ocram, OBJECT(dev), "imx7.ocram",
> FSL_IMX7_OCRAM_MEM_SIZE,
> &error_abort);
> memory_region_add_subregion(get_system_memory(), FSL_IMX7_OCRAM_MEM_ADDR,
>@@ -698,7 +698,7 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
> /*
> * OCRAM EPDC memory
> */
>- memory_region_init_ram(&s->ocram_epdc, NULL, "imx7.ocram_epdc",
>+ memory_region_init_ram(&s->ocram_epdc, OBJECT(dev), "imx7.ocram_epdc",
> FSL_IMX7_OCRAM_EPDC_SIZE,
> &error_abort);
> memory_region_add_subregion(get_system_memory(), FSL_IMX7_OCRAM_EPDC_ADDR,
>@@ -707,7 +707,7 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
> /*
> * OCRAM PXP memory
> */
>- memory_region_init_ram(&s->ocram_pxp, NULL, "imx7.ocram_pxp",
>+ memory_region_init_ram(&s->ocram_pxp, OBJECT(dev), "imx7.ocram_pxp",
> FSL_IMX7_OCRAM_PXP_SIZE,
> &error_abort);
> memory_region_add_subregion(get_system_memory(), FSL_IMX7_OCRAM_PXP_ADDR,
>@@ -716,7 +716,7 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
> /*
> * OCRAM_S memory
> */
>- memory_region_init_ram(&s->ocram_s, NULL, "imx7.ocram_s",
>+ memory_region_init_ram(&s->ocram_s, OBJECT(dev), "imx7.ocram_s",
> FSL_IMX7_OCRAM_S_SIZE,
> &error_abort);
> memory_region_add_subregion(get_system_memory(), FSL_IMX7_OCRAM_S_ADDR,
>diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c
>index 9351d53850..cecfc25e9a 100644
>--- a/hw/arm/imx25_pdk.c
>+++ b/hw/arm/imx25_pdk.c
>@@ -104,7 +104,7 @@ static void imx25_pdk_init(MachineState *machine)
> ram_size -= size;
>
> if (size < ram[i].size) {
>- memory_region_init_alias(&s->ram_alias, NULL, "ram.alias",
>+ memory_region_init_alias(&s->ram_alias, OBJECT(machine), "ram.alias",
> machine->ram,
> alias_offset, ram[i].size - size);
> memory_region_add_subregion(get_system_memory(),
>diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
>index ed715a3eb8..81c0bce8f9 100644
>--- a/hw/arm/integratorcp.c
>+++ b/hw/arm/integratorcp.c
>@@ -617,7 +617,7 @@ static void integratorcp_init(MachineState *machine)
> /* SDRAM at address zero*/
> memory_region_add_subregion(address_space_mem, 0, machine->ram);
> /* And again at address 0x80000000 */
>- memory_region_init_alias(ram_alias, NULL, "ram.alias", machine->ram,
>+ memory_region_init_alias(ram_alias, OBJECT(machine), "ram.alias", machine->ram,
> 0, ram_size);
> memory_region_add_subregion(address_space_mem, 0x80000000, ram_alias);
>
>diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
>index 36e12bb362..3e879c492d 100644
>--- a/hw/arm/kzm.c
>+++ b/hw/arm/kzm.c
>@@ -104,7 +104,7 @@ static void kzm_init(MachineState *machine)
> ram_size -= size;
>
> if (size < ram[i].size) {
>- memory_region_init_alias(&s->ram_alias, NULL, "ram.alias",
>+ memory_region_init_alias(&s->ram_alias, OBJECT(machine), "ram.alias",
> machine->ram,
> alias_offset, ram[i].size - size);
> memory_region_add_subregion(get_system_memory(),
>diff --git a/hw/arm/max78000_soc.c b/hw/arm/max78000_soc.c
>index b8e0265de2..41cfaee925 100644
>--- a/hw/arm/max78000_soc.c
>+++ b/hw/arm/max78000_soc.c
>@@ -74,7 +74,7 @@ static void max78000_soc_realize(DeviceState *dev_soc, Error **errp)
>
> memory_region_add_subregion(system_memory, FLASH_BASE_ADDRESS, &s->flash);
>
>- memory_region_init_ram(&s->sram, NULL, "MAX78000.sram", SRAM_SIZE,
>+ memory_region_init_ram(&s->sram, obj, "MAX78000.sram", SRAM_SIZE,
> &err);
>
> gcrdev = DEVICE(&s->gcr);
>diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
>index 32e3db1134..a57915e208 100644
>--- a/hw/arm/mps2-tz.c
>+++ b/hw/arm/mps2-tz.c
>@@ -338,7 +338,7 @@ static MemoryRegion *mr_for_raminfo(MPS2TZMachineState *mms,
> assert(raminfo->mrindex < MPS2TZ_RAM_MAX);
> ram = &mms->ram[raminfo->mrindex];
>
>- memory_region_init_ram(ram, NULL, raminfo->name,
>+ memory_region_init_ram(ram, OBJECT(mms), raminfo->name,
> raminfo->size, &error_fatal);
> if (raminfo->flags & IS_ROM) {
> memory_region_set_readonly(ram, true);
>@@ -349,10 +349,10 @@ static MemoryRegion *mr_for_raminfo(MPS2TZMachineState *mms,
> /* Create an alias of an entire original MemoryRegion @orig
> * located at @base in the memory map.
> */
>-static void make_ram_alias(MemoryRegion *mr, const char *name,
>+static void make_ram_alias(Object *owner, MemoryRegion *mr, const char *name,
> MemoryRegion *orig, hwaddr base)
> {
>- memory_region_init_alias(mr, NULL, name, orig, 0,
>+ memory_region_init_alias(mr, owner, name, orig, 0,
> memory_region_size(orig));
> memory_region_add_subregion(get_system_memory(), base, mr);
> }
>@@ -767,7 +767,8 @@ static void create_non_mpc_ram(MPS2TZMachineState *mms)
> if (p->flags & IS_ALIAS) {
> SysBusDevice *mpc_sbd = SYS_BUS_DEVICE(&mms->mpc[p->mpc]);
> MemoryRegion *upstream = sysbus_mmio_get_region(mpc_sbd, 1);
>- make_ram_alias(&mms->ram[p->mrindex], p->name, upstream, p->base);
>+ make_ram_alias(OBJECT(mms), &mms->ram[p->mrindex], p->name,
>+ upstream, p->base);
> } else if (p->mpc == -1) {
> /* RAM not behind an MPC */
> MemoryRegion *mr = mr_for_raminfo(mms, p);
>diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
>index 23a814e4e4..1dec4a5d4d 100644
>--- a/hw/arm/mps2.c
>+++ b/hw/arm/mps2.c
>@@ -115,20 +115,20 @@ OBJECT_DECLARE_TYPE(MPS2MachineState, MPS2MachineClass, MPS2_MACHINE)
> /* Initialize the auxiliary RAM region @mr and map it into
> * the memory map at @base.
> */
>-static void make_ram(MemoryRegion *mr, const char *name,
>+static void make_ram(Object *owner, MemoryRegion *mr, const char *name,
> hwaddr base, hwaddr size)
> {
>- memory_region_init_ram(mr, NULL, name, size, &error_fatal);
>+ memory_region_init_ram(mr, owner, name, size, &error_fatal);
> memory_region_add_subregion(get_system_memory(), base, mr);
> }
>
> /* Create an alias of an entire original MemoryRegion @orig
> * located at @base in the memory map.
> */
>-static void make_ram_alias(MemoryRegion *mr, const char *name,
>+static void make_ram_alias(Object *owner, MemoryRegion *mr, const char *name,
> MemoryRegion *orig, hwaddr base)
> {
>- memory_region_init_alias(mr, NULL, name, orig, 0,
>+ memory_region_init_alias(mr, owner, name, orig, 0,
> memory_region_size(orig));
> memory_region_add_subregion(get_system_memory(), base, mr);
> }
>@@ -192,12 +192,12 @@ static void mps2_common_init(MachineState *machine)
> memory_region_add_subregion(system_memory, mmc->psram_base, machine->ram);
>
> if (mmc->has_block_ram) {
>- make_ram(&mms->blockram, "mps.blockram", 0x01000000, 0x4000);
>- make_ram_alias(&mms->blockram_m1, "mps.blockram_m1",
>+ make_ram(obj, &mms->blockram, "mps.blockram", 0x01000000, 0x4000);
>+ make_ram_alias(obj, &mms->blockram_m1, "mps.blockram_m1",
> &mms->blockram, 0x01004000);
>- make_ram_alias(&mms->blockram_m2, "mps.blockram_m2",
>+ make_ram_alias(obj, &mms->blockram_m2, "mps.blockram_m2",
> &mms->blockram, 0x01008000);
>- make_ram_alias(&mms->blockram_m3, "mps.blockram_m3",
>+ make_ram_alias(obj, &mms->blockram_m3, "mps.blockram_m3",
> &mms->blockram, 0x0100c000);
> }
>
>@@ -205,17 +205,18 @@ static void mps2_common_init(MachineState *machine)
> case FPGA_AN385:
> case FPGA_AN386:
> case FPGA_AN500:
>- make_ram(&mms->ssram1, "mps.ssram1", 0x0, 0x400000);
>- make_ram_alias(&mms->ssram1_m, "mps.ssram1_m", &mms->ssram1, 0x400000);
>- make_ram(&mms->ssram23, "mps.ssram23", 0x20000000, 0x400000);
>- make_ram_alias(&mms->ssram23_m, "mps.ssram23_m",
>+ make_ram(obj, &mms->ssram1, "mps.ssram1", 0x0, 0x400000);
>+ make_ram_alias(obj, &mms->ssram1_m, "mps.ssram1_m",
>+ &mms->ssram1, 0x400000);
>+ make_ram(obj, &mms->ssram23, "mps.ssram23", 0x20000000, 0x400000);
>+ make_ram_alias(obj, &mms->ssram23_m, "mps.ssram23_m",
> &mms->ssram23, 0x20400000);
> break;
> case FPGA_AN511:
>- make_ram(&mms->blockram, "mps.blockram", 0x0, 0x40000);
>- make_ram(&mms->ssram1, "mps.ssram1", 0x00400000, 0x00800000);
>- make_ram(&mms->sram, "mps.sram", 0x20000000, 0x20000);
>- make_ram(&mms->ssram23, "mps.ssram23", 0x20400000, 0x400000);
>+ make_ram(obj, &mms->blockram, "mps.blockram", 0x0, 0x40000);
>+ make_ram(obj, &mms->ssram1, "mps.ssram1", 0x00400000, 0x00800000);
>+ make_ram(obj, &mms->sram, "mps.sram", 0x20000000, 0x20000);
>+ make_ram(obj, &mms->ssram23, "mps.ssram23", 0x20400000, 0x400000);
> break;
> default:
> g_assert_not_reached();
>diff --git a/hw/arm/mps3r.c b/hw/arm/mps3r.c
>index 4d432de6ba..d6c29c1172 100644
>--- a/hw/arm/mps3r.c
>+++ b/hw/arm/mps3r.c
>@@ -215,7 +215,7 @@ static MemoryRegion *mr_for_raminfo(MPS3RMachineState *mms,
> assert(raminfo->mrindex < MPS3R_RAM_MAX);
> ram = &mms->ram[raminfo->mrindex];
>
>- memory_region_init_ram(ram, NULL, raminfo->name,
>+ memory_region_init_ram(ram, OBJECT(mms), raminfo->name,
> raminfo->size, &error_fatal);
> if (raminfo->flags & IS_ROM) {
> memory_region_set_readonly(ram, true);
>@@ -397,7 +397,7 @@ static void mps3r_common_init(MachineState *machine)
> object_unref(mms->cpu[i]);
>
> /* Per-CPU RAM */
>- memory_region_init_ram(&mms->cpu_ram[i], NULL, ramname,
>+ memory_region_init_ram(&mms->cpu_ram[i], OBJECT(mms), ramname,
> 0x1000, &error_fatal);
> memory_region_add_subregion(&mms->cpu_sysmem[i], 0xe7c01000,
> &mms->cpu_ram[i]);
>diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
>index c03778c439..ce320a5a38 100644
>--- a/hw/arm/msf2-soc.c
>+++ b/hw/arm/msf2-soc.c
>@@ -128,7 +128,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
> memory_region_add_subregion(system_memory, ENVM_BASE_ADDRESS, &s->nvm);
> memory_region_add_subregion(system_memory, 0, &s->nvm_alias);
>
>- memory_region_init_ram(&s->sram, NULL, "MSF2.eSRAM", s->esram_size,
>+ memory_region_init_ram(&s->sram, OBJECT(dev_soc), "MSF2.eSRAM", s->esram_size,
> &error_fatal);
> memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, &s->sram);
>
>diff --git a/hw/arm/msf2-som.c b/hw/arm/msf2-som.c
>index 0d0e2514dd..5493f1cf70 100644
>--- a/hw/arm/msf2-som.c
>+++ b/hw/arm/msf2-som.c
>@@ -55,7 +55,7 @@ static void emcraft_sf2_s2s010_init(MachineState *machine)
> MemoryRegion *ddr = g_new(MemoryRegion, 1);
> Clock *m3clk;
>
>- memory_region_init_ram(ddr, NULL, "ddr-ram", DDR_SIZE,
>+ memory_region_init_ram(ddr, OBJECT(machine), "ddr-ram", DDR_SIZE,
> &error_fatal);
> memory_region_add_subregion(sysmem, DDR_BASE_ADDRESS, ddr);
>
>diff --git a/hw/arm/musca.c b/hw/arm/musca.c
>index 75d82eebca..38eac4af76 100644
>--- a/hw/arm/musca.c
>+++ b/hw/arm/musca.c
>@@ -235,12 +235,12 @@ static MemoryRegion *make_mpc(MuscaMachineState *mms, void *opaque,
> switch (mpcinfo[i].type) {
> case MPC_ROM:
> downstream = &mms->ram[i];
>- memory_region_init_rom(downstream, NULL, mpcinfo[i].name,
>+ memory_region_init_rom(downstream, OBJECT(mms), mpcinfo[i].name,
> mpcinfo[i].size, &error_fatal);
> break;
> case MPC_RAM:
> downstream = &mms->ram[i];
>- memory_region_init_ram(downstream, NULL, mpcinfo[i].name,
>+ memory_region_init_ram(downstream, OBJECT(mms), mpcinfo[i].name,
> mpcinfo[i].size, &error_fatal);
> break;
> case MPC_CRYPTOISLAND:
>diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
>index 86ea348d3d..fda42f71d5 100644
>--- a/hw/arm/musicpal.c
>+++ b/hw/arm/musicpal.c
>@@ -1236,7 +1236,7 @@ static void musicpal_init(MachineState *machine)
>
> memory_region_add_subregion(address_space_mem, 0, machine->ram);
>
>- memory_region_init_ram(sram, NULL, "musicpal.sram", MP_SRAM_SIZE,
>+ memory_region_init_ram(sram, OBJECT(machine), "musicpal.sram", MP_SRAM_SIZE,
> &error_fatal);
> memory_region_add_subregion(address_space_mem, MP_SRAM_BASE, sram);
>
>diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
>index 1bd6c6d4bc..f8d54c2716 100644
>--- a/hw/arm/omap_sx1.c
>+++ b/hw/arm/omap_sx1.c
>@@ -128,22 +128,22 @@ static void sx1_init(MachineState *machine, const int version)
> mpu = omap310_mpu_init(OBJECT(machine), machine->ram, machine->cpu_type);
>
> /* External Flash (EMIFS) */
>- memory_region_init_rom(flash, NULL, "omap_sx1.flash0-0", flash_size,
>+ memory_region_init_rom(flash, OBJECT(machine), "omap_sx1.flash0-0", flash_size,
> &error_fatal);
> memory_region_add_subregion(address_space, OMAP_CS0_BASE, flash);
>
>- memory_region_init_io(&cs[0], NULL, &static_ops, &cs0val,
>+ memory_region_init_io(&cs[0], OBJECT(machine), &static_ops, &cs0val,
> "sx1.cs0", OMAP_CS0_SIZE - flash_size);
> memory_region_add_subregion(address_space,
> OMAP_CS0_BASE + flash_size, &cs[0]);
>
>
>- memory_region_init_io(&cs[2], NULL, &static_ops, &cs2val,
>+ memory_region_init_io(&cs[2], OBJECT(machine), &static_ops, &cs2val,
> "sx1.cs2", OMAP_CS2_SIZE);
> memory_region_add_subregion(address_space,
> OMAP_CS2_BASE, &cs[2]);
>
>- memory_region_init_io(&cs[3], NULL, &static_ops, &cs3val,
>+ memory_region_init_io(&cs[3], OBJECT(machine), &static_ops, &cs3val,
> "sx1.cs3", OMAP_CS3_SIZE);
> memory_region_add_subregion(address_space,
> OMAP_CS3_BASE, &cs[3]);
>@@ -160,11 +160,11 @@ static void sx1_init(MachineState *machine, const int version)
> if ((version == 1) &&
> (dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
> MemoryRegion *flash_1 = g_new(MemoryRegion, 1);
>- memory_region_init_rom(flash_1, NULL, "omap_sx1.flash1-0",
>+ memory_region_init_rom(flash_1, OBJECT(machine), "omap_sx1.flash1-0",
> FLASH1_SIZE, &error_fatal);
> memory_region_add_subregion(address_space, OMAP_CS1_BASE, flash_1);
>
>- memory_region_init_io(&cs[1], NULL, &static_ops, &cs1val,
>+ memory_region_init_io(&cs[1], OBJECT(machine), &static_ops, &cs1val,
> "sx1.cs1", OMAP_CS1_SIZE - FLASH1_SIZE);
> memory_region_add_subregion(address_space,
> OMAP_CS1_BASE + FLASH1_SIZE, &cs[1]);
>@@ -175,7 +175,7 @@ static void sx1_init(MachineState *machine, const int version)
> SECTOR_SIZE, 4, 0, 0, 0, 0, 0);
> fl_idx++;
> } else {
>- memory_region_init_io(&cs[1], NULL, &static_ops, &cs1val,
>+ memory_region_init_io(&cs[1], OBJECT(machine), &static_ops, &cs1val,
> "sx1.cs1", OMAP_CS1_SIZE);
> memory_region_add_subregion(address_space,
> OMAP_CS1_BASE, &cs[1]);
>diff --git a/hw/arm/realview.c b/hw/arm/realview.c
>index 2441137222..73bfffa6e6 100644
>--- a/hw/arm/realview.c
>+++ b/hw/arm/realview.c
>@@ -159,18 +159,18 @@ static void realview_init(MachineState *machine,
> ram_lo = g_new(MemoryRegion, 1);
> low_ram_size = ram_size - 0x20000000;
> ram_size = 0x20000000;
>- memory_region_init_ram(ram_lo, NULL, "realview.lowmem", low_ram_size,
>+ memory_region_init_ram(ram_lo, OBJECT(machine), "realview.lowmem", low_ram_size,
> &error_fatal);
> memory_region_add_subregion(sysmem, 0x20000000, ram_lo);
> }
>
>- memory_region_init_ram(ram_hi, NULL, "realview.highmem", ram_size,
>+ memory_region_init_ram(ram_hi, OBJECT(machine), "realview.highmem", ram_size,
> &error_fatal);
> low_ram_size = ram_size;
> if (low_ram_size > 0x10000000)
> low_ram_size = 0x10000000;
> /* SDRAM at address zero. */
>- memory_region_init_alias(ram_alias, NULL, "realview.alias",
>+ memory_region_init_alias(ram_alias, OBJECT(machine), "realview.alias",
> ram_hi, 0, low_ram_size);
> memory_region_add_subregion(sysmem, 0, ram_alias);
> if (is_pb) {
>@@ -396,7 +396,7 @@ static void realview_init(MachineState *machine,
> startup code. I guess this works on real hardware because the
> BootROM happens to be in ROM/flash or in memory that isn't clobbered
> until after Linux boots the secondary CPUs. */
>- memory_region_init_ram(ram_hack, NULL, "realview.hack", 0x1000,
>+ memory_region_init_ram(ram_hack, OBJECT(machine), "realview.hack", 0x1000,
> &error_fatal);
> memory_region_add_subregion(sysmem, SMP_BOOT_ADDR, ram_hack);
>
>diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
>index f632df742b..c9adc972c1 100644
>--- a/hw/arm/sbsa-ref.c
>+++ b/hw/arm/sbsa-ref.c
>@@ -410,7 +410,7 @@ static void create_secure_ram(SBSAMachineState *sms,
> hwaddr base = sbsa_ref_memmap[SBSA_SECURE_MEM].base;
> hwaddr size = sbsa_ref_memmap[SBSA_SECURE_MEM].size;
>
>- memory_region_init_ram(secram, NULL, "sbsa-ref.secure-ram", size,
>+ memory_region_init_ram(secram, OBJECT(sms), "sbsa-ref.secure-ram", size,
> &error_fatal);
> memory_region_add_subregion(secure_sysmem, base, secram);
> }
>diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
>index 6a732a3c11..1bc428e063 100644
>--- a/hw/arm/stellaris.c
>+++ b/hw/arm/stellaris.c
>@@ -1084,11 +1084,11 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
> object_property_add_child(OBJECT(ms), "soc", soc_container);
>
> /* Flash programming is done via the SCU, so pretend it is ROM. */
>- memory_region_init_rom(flash, NULL, "stellaris.flash", flash_size,
>+ memory_region_init_rom(flash, OBJECT(ms), "stellaris.flash", flash_size,
> &error_fatal);
> memory_region_add_subregion(system_memory, 0, flash);
>
>- memory_region_init_ram(sram, NULL, "stellaris.sram", sram_size,
>+ memory_region_init_ram(sram, OBJECT(ms), "stellaris.sram", sram_size,
> &error_fatal);
> memory_region_add_subregion(system_memory, 0x20000000, sram);
>
>diff --git a/hw/arm/stm32f100_soc.c b/hw/arm/stm32f100_soc.c
>index e9e722f359..d6d81c1338 100644
>--- a/hw/arm/stm32f100_soc.c
>+++ b/hw/arm/stm32f100_soc.c
>@@ -108,7 +108,7 @@ static void stm32f100_soc_realize(DeviceState *dev_soc, Error **errp)
> memory_region_add_subregion(system_memory, 0, &s->flash_alias);
>
> /* Init SRAM region */
>- memory_region_init_ram(&s->sram, NULL, "STM32F100.sram", SRAM_SIZE,
>+ memory_region_init_ram(&s->sram, OBJECT(dev_soc), "STM32F100.sram", SRAM_SIZE,
> &error_fatal);
> memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, &s->sram);
>
>diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
>index a03c6b4002..2997e7d777 100644
>--- a/hw/arm/stm32f205_soc.c
>+++ b/hw/arm/stm32f205_soc.c
>@@ -121,7 +121,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
> memory_region_add_subregion(system_memory, FLASH_BASE_ADDRESS, &s->flash);
> memory_region_add_subregion(system_memory, 0, &s->flash_alias);
>
>- memory_region_init_ram(&s->sram, NULL, "STM32F205.sram", SRAM_SIZE,
>+ memory_region_init_ram(&s->sram, OBJECT(dev_soc), "STM32F205.sram", SRAM_SIZE,
> &error_fatal);
> memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, &s->sram);
>
>diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
>index dc9b3053a5..4783f3f64a 100644
>--- a/hw/arm/stm32f405_soc.c
>+++ b/hw/arm/stm32f405_soc.c
>@@ -134,7 +134,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
> memory_region_add_subregion(system_memory, FLASH_BASE_ADDRESS, &s->flash);
> memory_region_add_subregion(system_memory, 0, &s->flash_alias);
>
>- memory_region_init_ram(&s->sram, NULL, "STM32F405.sram", SRAM_SIZE,
>+ memory_region_init_ram(&s->sram, OBJECT(dev_soc), "STM32F405.sram", SRAM_SIZE,
> &err);
> if (err != NULL) {
> error_propagate(errp, err);
>@@ -142,7 +142,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
> }
> memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, &s->sram);
>
>- memory_region_init_ram(&s->ccm, NULL, "STM32F405.ccm", CCM_SIZE,
>+ memory_region_init_ram(&s->ccm, OBJECT(dev_soc), "STM32F405.ccm", CCM_SIZE,
> &err);
> if (err != NULL) {
> error_propagate(errp, err);
>diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
>index a643c6b079..f877ccf330 100644
>--- a/hw/arm/vexpress.c
>+++ b/hw/arm/vexpress.c
>@@ -392,7 +392,7 @@ static void a15_daughterboard_init(VexpressMachineState *vms,
> /* 0x2b060000: SP805 watchdog: not modelled */
> /* 0x2b0a0000: PL341 dynamic memory controller: not modelled */
> /* 0x2e000000: system SRAM */
>- memory_region_init_ram(&vms->a15sram, NULL, "vexpress.a15sram", 0x10000,
>+ memory_region_init_ram(&vms->a15sram, OBJECT(vms), "vexpress.a15sram", 0x10000,
> &error_fatal);
> memory_region_add_subregion(sysmem, 0x2e000000, &vms->a15sram);
>
>@@ -677,7 +677,7 @@ static void vexpress_common_init(MachineState *machine)
> /* Map flash 0 as an alias into low memory */
> MemoryRegion *flash0mem;
> flash0mem = sysbus_mmio_get_region(SYS_BUS_DEVICE(pflash0), 0);
>- memory_region_init_alias(&vms->flashalias, NULL, "vexpress.flashalias",
>+ memory_region_init_alias(&vms->flashalias, OBJECT(vms), "vexpress.flashalias",
> flash0mem, 0, VEXPRESS_FLASH_SIZE);
> memory_region_add_subregion(sysmem, map[VE_NORFLASHALIAS], &vms->flashalias);
> }
>@@ -687,12 +687,12 @@ static void vexpress_common_init(MachineState *machine)
> "vexpress.flash1", dinfo);
>
> sram_size = 0x2000000;
>- memory_region_init_ram(&vms->sram, NULL, "vexpress.sram", sram_size,
>+ memory_region_init_ram(&vms->sram, OBJECT(vms), "vexpress.sram", sram_size,
> &error_fatal);
> memory_region_add_subregion(sysmem, map[VE_SRAM], &vms->sram);
>
> vram_size = 0x800000;
>- memory_region_init_ram(&vms->vram, NULL, "vexpress.vram", vram_size,
>+ memory_region_init_ram(&vms->vram, OBJECT(vms), "vexpress.vram", vram_size,
> &error_fatal);
> memory_region_add_subregion(sysmem, map[VE_VIDEORAM], &vms->vram);
>
>diff --git a/hw/arm/virt.c b/hw/arm/virt.c
>index ea51a5f3bd..f2249a0b72 100644
>--- a/hw/arm/virt.c
>+++ b/hw/arm/virt.c
>@@ -2308,13 +2308,13 @@ static void create_platform_bus(VirtMachineState *vms)
> sysbus_mmio_get_region(s, 0));
> }
>
>-static void create_tag_ram(MemoryRegion *tag_sysmem,
>+static void create_tag_ram(Object *owner, MemoryRegion *tag_sysmem,
> hwaddr base, hwaddr size,
> const char *name)
> {
> MemoryRegion *tagram = g_new(MemoryRegion, 1);
>
>- memory_region_init_ram(tagram, NULL, name, size / 32, &error_fatal);
>+ memory_region_init_ram(tagram, owner, name, size / 32, &error_fatal);
> memory_region_add_subregion(tag_sysmem, base / 32, tagram);
> }
>
>@@ -2328,7 +2328,7 @@ static void create_secure_ram(VirtMachineState *vms,
> hwaddr size = vms->memmap[VIRT_SECURE_MEM].size;
> MachineState *ms = MACHINE(vms);
>
>- memory_region_init_ram(secram, NULL, "virt.secure-ram", size,
>+ memory_region_init_ram(secram, OBJECT(vms), "virt.secure-ram", size,
> &error_fatal);
> memory_region_add_subregion(secure_sysmem, base, secram);
>
>@@ -2340,7 +2340,8 @@ static void create_secure_ram(VirtMachineState *vms,
> qemu_fdt_setprop_string(ms->fdt, nodename, "secure-status", "okay");
>
> if (secure_tag_sysmem) {
>- create_tag_ram(secure_tag_sysmem, base, size, "mach-virt.secure-tag");
>+ create_tag_ram(OBJECT(vms), secure_tag_sysmem, base, size,
>+ "mach-virt.secure-tag");
> }
>
> g_free(nodename);
>@@ -2840,7 +2841,7 @@ static void virt_post_cpus_gic_realized(VirtMachineState *vms,
> exit(1);
> }
>
>- memory_region_init_ram(pvtime, NULL, "pvtime", pvtime_size, NULL);
>+ memory_region_init_ram(pvtime, OBJECT(vms), "pvtime", pvtime_size, NULL);
> memory_region_add_subregion(sysmem, pvtime_reg_base, pvtime);
> }
> if (!aarch64 && vms->virt) {
>@@ -3200,7 +3201,7 @@ static void machvirt_init(MachineState *machine)
> }
>
> if (tag_sysmem) {
>- create_tag_ram(tag_sysmem, vms->memmap[VIRT_MEM].base,
>+ create_tag_ram(OBJECT(vms), tag_sysmem, vms->memmap[VIRT_MEM].base,
> machine->ram_size, "mach-virt.tag");
> }
>
>diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
>index 30f0ce5b5f..441289e63f 100644
>--- a/hw/arm/xilinx_zynq.c
>+++ b/hw/arm/xilinx_zynq.c
>@@ -238,7 +238,7 @@ static void zynq_init(MachineState *machine)
> memory_region_add_subregion(address_space_mem, 0, machine->ram);
>
> /* 256K of on-chip memory */
>- memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 * KiB,
>+ memory_region_init_ram(ocm_ram, OBJECT(machine), "zynq.ocm_ram", 256 * KiB,
> &error_fatal);
> memory_region_add_subregion(address_space_mem, 0xFFFC0000, ocm_ram);
>
>diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
>index e4a10861a8..a25d5d3158 100644
>--- a/hw/arm/xlnx-zynqmp.c
>+++ b/hw/arm/xlnx-zynqmp.c
>@@ -510,7 +510,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
> for (i = 0; i < XLNX_ZYNQMP_NUM_OCM_BANKS; i++) {
> char *ocm_name = g_strdup_printf("zynqmp.ocm_ram_bank_%d", i);
>
>- memory_region_init_ram(&s->ocm_ram[i], NULL, ocm_name,
>+ memory_region_init_ram(&s->ocm_ram[i], OBJECT(dev), ocm_name,
> XLNX_ZYNQMP_OCM_RAM_SIZE, &error_fatal);
> memory_region_add_subregion(get_system_memory(),
> XLNX_ZYNQMP_OCM_RAM_0_ADDRESS +
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 095/134] hw/arm/omap1: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (93 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 094/134] hw/arm: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 096/134] hw/sh4: " Alexander Graf
` (39 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
omap1.c models the TI OMAP310 MPU with ~20 pre-QOM sub-block init
helpers (omap_mpu_timer_init, omap_ulpd_pm_init, omap_pin_cfg_init,
omap_id_init, omap_mpui_init, omap_tipb_bridge_init, omap_tcmi_init,
omap_dpll_init, omap_clkm_init, omap_mpuio_init, omap_uwire_init,
omap_pwl_init, omap_pwt_init, omap_rtc_init, omap_mcbsp_init,
omap_lpg_init, omap_setup_mpui_io, omap_setup_dsp_mapping, ...) that
each create MemoryRegions with owner==NULL.
Thread an Object *owner first argument through every sub-block init
helper. All are static and called only from omap310_mpu_init(),
which already carries an Object *parent from the earlier device
conversion; pass it through.
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/omap1.c | 175 ++++++++++++++++++++++++++-----------------------
1 file changed, 94 insertions(+), 81 deletions(-)
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index e5e092e074..be6af35e26 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -221,8 +221,8 @@ static void omap_mpu_timer_reset(struct omap_mpu_timer_s *s)
s->it_ena = 1;
}
-static struct omap_mpu_timer_s *omap_mpu_timer_init(MemoryRegion *system_memory,
- hwaddr base,
+static struct omap_mpu_timer_s *omap_mpu_timer_init(Object *owner,
+ MemoryRegion *system_memory, hwaddr base,
qemu_irq irq, omap_clk clk)
{
struct omap_mpu_timer_s *s = g_new0(struct omap_mpu_timer_s, 1);
@@ -234,7 +234,7 @@ static struct omap_mpu_timer_s *omap_mpu_timer_init(MemoryRegion *system_memory,
omap_mpu_timer_reset(s);
omap_timer_clk_setup(s);
- memory_region_init_io(&s->iomem, NULL, &omap_mpu_timer_ops, s,
+ memory_region_init_io(&s->iomem, owner, &omap_mpu_timer_ops, s,
"omap-mpu-timer", 0x100);
memory_region_add_subregion(system_memory, base, &s->iomem);
@@ -353,8 +353,8 @@ static void omap_wd_timer_reset(struct omap_watchdog_timer_s *s)
omap_timer_update(&s->timer);
}
-static struct omap_watchdog_timer_s *omap_wd_timer_init(MemoryRegion *memory,
- hwaddr base,
+static struct omap_watchdog_timer_s *omap_wd_timer_init(Object *owner,
+ MemoryRegion *memory, hwaddr base,
qemu_irq irq, omap_clk clk)
{
struct omap_watchdog_timer_s *s = g_new0(struct omap_watchdog_timer_s, 1);
@@ -365,7 +365,7 @@ static struct omap_watchdog_timer_s *omap_wd_timer_init(MemoryRegion *memory,
omap_wd_timer_reset(s);
omap_timer_clk_setup(&s->timer);
- memory_region_init_io(&s->iomem, NULL, &omap_wd_timer_ops, s,
+ memory_region_init_io(&s->iomem, owner, &omap_wd_timer_ops, s,
"omap-wd-timer", 0x100);
memory_region_add_subregion(memory, base, &s->iomem);
@@ -462,8 +462,8 @@ static void omap_os_timer_reset(struct omap_32khz_timer_s *s)
s->timer.ar = 1;
}
-static struct omap_32khz_timer_s *omap_os_timer_init(MemoryRegion *memory,
- hwaddr base,
+static struct omap_32khz_timer_s *omap_os_timer_init(Object *owner,
+ MemoryRegion *memory, hwaddr base,
qemu_irq irq, omap_clk clk)
{
struct omap_32khz_timer_s *s = g_new0(struct omap_32khz_timer_s, 1);
@@ -474,7 +474,7 @@ static struct omap_32khz_timer_s *omap_os_timer_init(MemoryRegion *memory,
omap_os_timer_reset(s);
omap_timer_clk_setup(&s->timer);
- memory_region_init_io(&s->iomem, NULL, &omap_os_timer_ops, s,
+ memory_region_init_io(&s->iomem, owner, &omap_os_timer_ops, s,
"omap-os-timer", 0x800);
memory_region_add_subregion(memory, base, &s->iomem);
@@ -707,11 +707,11 @@ static void omap_ulpd_pm_reset(struct omap_mpu_state_s *mpu)
omap_clk_reparent(omap_findclk(mpu, "ck_48m"), omap_findclk(mpu, "dpll4"));
}
-static void omap_ulpd_pm_init(MemoryRegion *system_memory,
- hwaddr base,
+static void omap_ulpd_pm_init(Object *owner,
+ MemoryRegion *system_memory, hwaddr base,
struct omap_mpu_state_s *mpu)
{
- memory_region_init_io(&mpu->ulpd_pm_iomem, NULL, &omap_ulpd_pm_ops, mpu,
+ memory_region_init_io(&mpu->ulpd_pm_iomem, owner, &omap_ulpd_pm_ops, mpu,
"omap-ulpd-pm", 0x800);
memory_region_add_subregion(system_memory, base, &mpu->ulpd_pm_iomem);
omap_ulpd_pm_reset(mpu);
@@ -933,11 +933,11 @@ static void omap_pin_cfg_reset(struct omap_mpu_state_s *mpu)
memset(mpu->mod_conf_ctrl, 0, sizeof(mpu->mod_conf_ctrl));
}
-static void omap_pin_cfg_init(MemoryRegion *system_memory,
- hwaddr base,
+static void omap_pin_cfg_init(Object *owner,
+ MemoryRegion *system_memory, hwaddr base,
struct omap_mpu_state_s *mpu)
{
- memory_region_init_io(&mpu->pin_cfg_iomem, NULL, &omap_pin_cfg_ops, mpu,
+ memory_region_init_io(&mpu->pin_cfg_iomem, owner, &omap_pin_cfg_ops, mpu,
"omap-pin-cfg", 0x800);
memory_region_add_subregion(system_memory, base, &mpu->pin_cfg_iomem);
omap_pin_cfg_reset(mpu);
@@ -994,15 +994,16 @@ static const MemoryRegionOps omap_id_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
-static void omap_id_init(MemoryRegion *memory, struct omap_mpu_state_s *mpu)
+static void omap_id_init(Object *owner, MemoryRegion *memory,
+ struct omap_mpu_state_s *mpu)
{
- memory_region_init_io(&mpu->id_iomem, NULL, &omap_id_ops, mpu,
+ memory_region_init_io(&mpu->id_iomem, owner, &omap_id_ops, mpu,
"omap-id", 0x100000000ULL);
- memory_region_init_alias(&mpu->id_iomem_e18, NULL, "omap-id-e18", &mpu->id_iomem,
- 0xfffe1800, 0x800);
+ memory_region_init_alias(&mpu->id_iomem_e18, owner, "omap-id-e18",
+ &mpu->id_iomem, 0xfffe1800, 0x800);
memory_region_add_subregion(memory, 0xfffe1800, &mpu->id_iomem_e18);
- memory_region_init_alias(&mpu->id_iomem_ed4, NULL, "omap-id-ed4", &mpu->id_iomem,
- 0xfffed400, 0x100);
+ memory_region_init_alias(&mpu->id_iomem_ed4, owner, "omap-id-ed4",
+ &mpu->id_iomem, 0xfffed400, 0x100);
memory_region_add_subregion(memory, 0xfffed400, &mpu->id_iomem_ed4);
}
@@ -1086,10 +1087,10 @@ static void omap_mpui_reset(struct omap_mpu_state_s *s)
s->mpui_ctrl = 0x0003ff1b;
}
-static void omap_mpui_init(MemoryRegion *memory, hwaddr base,
+static void omap_mpui_init(Object *owner, MemoryRegion *memory, hwaddr base,
struct omap_mpu_state_s *mpu)
{
- memory_region_init_io(&mpu->mpui_iomem, NULL, &omap_mpui_ops, mpu,
+ memory_region_init_io(&mpu->mpui_iomem, owner, &omap_mpui_ops, mpu,
"omap-mpui", 0x100);
memory_region_add_subregion(memory, base, &mpu->mpui_iomem);
@@ -1195,7 +1196,7 @@ static void omap_tipb_bridge_reset(struct omap_tipb_bridge_s *s)
s->enh_control = 0x000f;
}
-static struct omap_tipb_bridge_s *omap_tipb_bridge_init(
+static struct omap_tipb_bridge_s *omap_tipb_bridge_init(Object *owner,
MemoryRegion *memory, hwaddr base,
qemu_irq abort_irq, omap_clk clk)
{
@@ -1204,7 +1205,7 @@ static struct omap_tipb_bridge_s *omap_tipb_bridge_init(
s->abort = abort_irq;
omap_tipb_bridge_reset(s);
- memory_region_init_io(&s->iomem, NULL, &omap_tipb_bridge_ops, s,
+ memory_region_init_io(&s->iomem, owner, &omap_tipb_bridge_ops, s,
"omap-tipb-bridge", 0x100);
memory_region_add_subregion(memory, base, &s->iomem);
@@ -1314,10 +1315,10 @@ static void omap_tcmi_reset(struct omap_mpu_state_s *mpu)
mpu->tcmi_regs[0x40 >> 2] = 0x00000000;
}
-static void omap_tcmi_init(MemoryRegion *memory, hwaddr base,
+static void omap_tcmi_init(Object *owner, MemoryRegion *memory, hwaddr base,
struct omap_mpu_state_s *mpu)
{
- memory_region_init_io(&mpu->tcmi_iomem, NULL, &omap_tcmi_ops, mpu,
+ memory_region_init_io(&mpu->tcmi_iomem, owner, &omap_tcmi_ops, mpu,
"omap-tcmi", 0x100);
memory_region_add_subregion(memory, base, &mpu->tcmi_iomem);
omap_tcmi_reset(mpu);
@@ -1399,11 +1400,12 @@ static void omap_dpll_reset(struct dpll_ctl_s *s)
omap_clk_setrate(s->dpll, 1, 1);
}
-static struct dpll_ctl_s *omap_dpll_init(MemoryRegion *memory,
+static struct dpll_ctl_s *omap_dpll_init(Object *owner, MemoryRegion *memory,
hwaddr base, omap_clk clk)
{
struct dpll_ctl_s *s = g_malloc0(sizeof(*s));
- memory_region_init_io(&s->iomem, NULL, &omap_dpll_ops, s, "omap-dpll", 0x100);
+ memory_region_init_io(&s->iomem, owner, &omap_dpll_ops, s,
+ "omap-dpll", 0x100);
s->dpll = clk;
omap_dpll_reset(s);
@@ -1822,12 +1824,13 @@ static void omap_clkm_reset(struct omap_mpu_state_s *s)
s->clkm.dsp_rstct2 = 0x0000;
}
-static void omap_clkm_init(MemoryRegion *memory, hwaddr mpu_base,
- hwaddr dsp_base, struct omap_mpu_state_s *s)
+static void omap_clkm_init(Object *owner, MemoryRegion *memory,
+ hwaddr mpu_base, hwaddr dsp_base,
+ struct omap_mpu_state_s *s)
{
- memory_region_init_io(&s->clkm_iomem, NULL, &omap_clkm_ops, s,
+ memory_region_init_io(&s->clkm_iomem, owner, &omap_clkm_ops, s,
"omap-clkm", 0x100);
- memory_region_init_io(&s->clkdsp_iomem, NULL, &omap_clkdsp_ops, s,
+ memory_region_init_io(&s->clkdsp_iomem, owner, &omap_clkdsp_ops, s,
"omap-clkdsp", 0x1000);
s->clkm.arm_idlect1 = 0x03ff;
@@ -2071,8 +2074,8 @@ static void omap_mpuio_onoff(void *opaque, int line, int on)
omap_mpuio_kbd_update(s);
}
-static struct omap_mpuio_s *omap_mpuio_init(MemoryRegion *memory,
- hwaddr base,
+static struct omap_mpuio_s *omap_mpuio_init(Object *owner,
+ MemoryRegion *memory, hwaddr base,
qemu_irq kbd_int, qemu_irq gpio_int,
omap_clk clk)
{
@@ -2083,7 +2086,7 @@ static struct omap_mpuio_s *omap_mpuio_init(MemoryRegion *memory,
s->in = qemu_allocate_irqs(omap_mpuio_set, s, 16);
omap_mpuio_reset(s);
- memory_region_init_io(&s->iomem, NULL, &omap_mpuio_ops, s,
+ memory_region_init_io(&s->iomem, owner, &omap_mpuio_ops, s,
"omap-mpuio", 0x800);
memory_region_add_subregion(memory, base, &s->iomem);
@@ -2236,7 +2239,8 @@ static void omap_uwire_reset(struct omap_uwire_s *s)
s->setup[4] = 0;
}
-static struct omap_uwire_s *omap_uwire_init(MemoryRegion *system_memory,
+static struct omap_uwire_s *omap_uwire_init(Object *owner,
+ MemoryRegion *system_memory,
hwaddr base,
qemu_irq txirq, qemu_irq rxirq,
qemu_irq dma,
@@ -2249,7 +2253,8 @@ static struct omap_uwire_s *omap_uwire_init(MemoryRegion *system_memory,
s->txdrq = dma;
omap_uwire_reset(s);
- memory_region_init_io(&s->iomem, NULL, &omap_uwire_ops, s, "omap-uwire", 0x800);
+ memory_region_init_io(&s->iomem, owner, &omap_uwire_ops, s,
+ "omap-uwire", 0x800);
memory_region_add_subregion(system_memory, base, &s->iomem);
return s;
@@ -2345,7 +2350,8 @@ static void omap_pwl_clk_update(void *opaque, int line, int on)
omap_pwl_update(s);
}
-static struct omap_pwl_s *omap_pwl_init(MemoryRegion *system_memory,
+static struct omap_pwl_s *omap_pwl_init(Object *owner,
+ MemoryRegion *system_memory,
hwaddr base,
omap_clk clk)
{
@@ -2353,7 +2359,7 @@ static struct omap_pwl_s *omap_pwl_init(MemoryRegion *system_memory,
omap_pwl_reset(s);
- memory_region_init_io(&s->iomem, NULL, &omap_pwl_ops, s,
+ memory_region_init_io(&s->iomem, owner, &omap_pwl_ops, s,
"omap-pwl", 0x800);
memory_region_add_subregion(system_memory, base, &s->iomem);
@@ -2456,7 +2462,8 @@ static void omap_pwt_reset(struct omap_pwt_s *s)
s->gcr = 0;
}
-static struct omap_pwt_s *omap_pwt_init(MemoryRegion *system_memory,
+static struct omap_pwt_s *omap_pwt_init(Object *owner,
+ MemoryRegion *system_memory,
hwaddr base,
omap_clk clk)
{
@@ -2464,7 +2471,7 @@ static struct omap_pwt_s *omap_pwt_init(MemoryRegion *system_memory,
s->clk = clk;
omap_pwt_reset(s);
- memory_region_init_io(&s->iomem, NULL, &omap_pwt_ops, s,
+ memory_region_init_io(&s->iomem, owner, &omap_pwt_ops, s,
"omap-pwt", 0x800);
memory_region_add_subregion(system_memory, base, &s->iomem);
return s;
@@ -2822,7 +2829,8 @@ static void omap_rtc_reset(struct omap_rtc_s *s)
omap_rtc_tick(s);
}
-static struct omap_rtc_s *omap_rtc_init(MemoryRegion *system_memory,
+static struct omap_rtc_s *omap_rtc_init(Object *owner,
+ MemoryRegion *system_memory,
hwaddr base,
qemu_irq timerirq, qemu_irq alarmirq,
omap_clk clk)
@@ -2835,7 +2843,7 @@ static struct omap_rtc_s *omap_rtc_init(MemoryRegion *system_memory,
omap_rtc_reset(s);
- memory_region_init_io(&s->iomem, NULL, &omap_rtc_ops, s,
+ memory_region_init_io(&s->iomem, owner, &omap_rtc_ops, s,
"omap-rtc", 0x800);
memory_region_add_subregion(system_memory, base, &s->iomem);
@@ -3372,7 +3380,8 @@ static void omap_mcbsp_reset(struct omap_mcbsp_s *s)
timer_del(s->sink_timer);
}
-static struct omap_mcbsp_s *omap_mcbsp_init(MemoryRegion *system_memory,
+static struct omap_mcbsp_s *omap_mcbsp_init(Object *owner,
+ MemoryRegion *system_memory,
hwaddr base,
qemu_irq txirq, qemu_irq rxirq,
qemu_irq *dma, omap_clk clk)
@@ -3387,7 +3396,8 @@ static struct omap_mcbsp_s *omap_mcbsp_init(MemoryRegion *system_memory,
s->source_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, omap_mcbsp_source_tick, s);
omap_mcbsp_reset(s);
- memory_region_init_io(&s->iomem, NULL, &omap_mcbsp_ops, s, "omap-mcbsp", 0x800);
+ memory_region_init_io(&s->iomem, owner, &omap_mcbsp_ops, s,
+ "omap-mcbsp", 0x800);
memory_region_add_subregion(system_memory, base, &s->iomem);
return s;
@@ -3555,7 +3565,8 @@ static void omap_lpg_clk_update(void *opaque, int line, int on)
omap_lpg_update(s);
}
-static struct omap_lpg_s *omap_lpg_init(MemoryRegion *system_memory,
+static struct omap_lpg_s *omap_lpg_init(Object *owner,
+ MemoryRegion *system_memory,
hwaddr base, omap_clk clk)
{
struct omap_lpg_s *s = g_new0(struct omap_lpg_s, 1);
@@ -3564,7 +3575,8 @@ static struct omap_lpg_s *omap_lpg_init(MemoryRegion *system_memory,
omap_lpg_reset(s);
- memory_region_init_io(&s->iomem, NULL, &omap_lpg_ops, s, "omap-lpg", 0x800);
+ memory_region_init_io(&s->iomem, owner, &omap_lpg_ops, s,
+ "omap-lpg", 0x800);
memory_region_add_subregion(system_memory, base, &s->iomem);
omap_clk_adduser(clk, qemu_allocate_irq(omap_lpg_clk_update, s, 0));
@@ -3602,10 +3614,10 @@ static const MemoryRegionOps omap_mpui_io_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
-static void omap_setup_mpui_io(MemoryRegion *system_memory,
+static void omap_setup_mpui_io(Object *owner, MemoryRegion *system_memory,
struct omap_mpu_state_s *mpu)
{
- memory_region_init_io(&mpu->mpui_io_iomem, NULL, &omap_mpui_io_ops, mpu,
+ memory_region_init_io(&mpu->mpui_io_iomem, owner, &omap_mpui_io_ops, mpu,
"omap-mpui-io", 0x7fff);
memory_region_add_subregion(system_memory, OMAP_MPUI_BASE,
&mpu->mpui_io_iomem);
@@ -3678,14 +3690,15 @@ static const struct omap_map_s {
{ 0 }
};
-static void omap_setup_dsp_mapping(MemoryRegion *system_memory,
+static void omap_setup_dsp_mapping(Object *owner,
+ MemoryRegion *system_memory,
const struct omap_map_s *map)
{
MemoryRegion *io;
for (; map->phys_dsp; map ++) {
io = g_new(MemoryRegion, 1);
- memory_region_init_alias(io, NULL, map->name,
+ memory_region_init_alias(io, owner, map->name,
system_memory, map->phys_mpu, map->size);
memory_region_add_subregion(system_memory, map->phys_dsp, io);
}
@@ -3757,11 +3770,11 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
omap_clk_init(s);
/* Memory-mapped stuff */
- memory_region_init_ram(&s->imif_ram, NULL, "omap1.sram", s->sram_size,
+ memory_region_init_ram(&s->imif_ram, parent, "omap1.sram", s->sram_size,
&error_fatal);
memory_region_add_subregion(system_memory, OMAP_IMIF_BASE, &s->imif_ram);
- omap_clkm_init(system_memory, 0xfffece00, 0xe1008000, s);
+ omap_clkm_init(parent, system_memory, 0xfffece00, 0xe1008000, s);
s->ih[0] = qdev_new(parent, "intc[0]", "omap-intc");
qdev_prop_set_uint32(s->ih[0], "size", 0x100);
@@ -3804,21 +3817,21 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
soc_dma_port_add_mem(s->dma, memory_region_get_ram_ptr(&s->imif_ram),
OMAP_IMIF_BASE, s->sram_size);
- s->timer[0] = omap_mpu_timer_init(system_memory, 0xfffec500,
+ s->timer[0] = omap_mpu_timer_init(parent, system_memory, 0xfffec500,
qdev_get_gpio_in(s->ih[0], OMAP_INT_TIMER1),
omap_findclk(s, "mputim_ck"));
- s->timer[1] = omap_mpu_timer_init(system_memory, 0xfffec600,
+ s->timer[1] = omap_mpu_timer_init(parent, system_memory, 0xfffec600,
qdev_get_gpio_in(s->ih[0], OMAP_INT_TIMER2),
omap_findclk(s, "mputim_ck"));
- s->timer[2] = omap_mpu_timer_init(system_memory, 0xfffec700,
+ s->timer[2] = omap_mpu_timer_init(parent, system_memory, 0xfffec700,
qdev_get_gpio_in(s->ih[0], OMAP_INT_TIMER3),
omap_findclk(s, "mputim_ck"));
- s->wdt = omap_wd_timer_init(system_memory, 0xfffec800,
+ s->wdt = omap_wd_timer_init(parent, system_memory, 0xfffec800,
qdev_get_gpio_in(s->ih[0], OMAP_INT_WD_TIMER),
omap_findclk(s, "armwdt_ck"));
- s->os_timer = omap_os_timer_init(system_memory, 0xfffb9000,
+ s->os_timer = omap_os_timer_init(parent, system_memory, 0xfffb9000,
qdev_get_gpio_in(s->ih[1], OMAP_INT_OS_TIMER),
omap_findclk(s, "clk32-kHz"));
@@ -3827,20 +3840,20 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
omap_dma_get_lcdch(s->dma),
omap_findclk(s, "lcd_ck"));
- omap_ulpd_pm_init(system_memory, 0xfffe0800, s);
- omap_pin_cfg_init(system_memory, 0xfffe1000, s);
- omap_id_init(system_memory, s);
+ omap_ulpd_pm_init(parent, system_memory, 0xfffe0800, s);
+ omap_pin_cfg_init(parent, system_memory, 0xfffe1000, s);
+ omap_id_init(parent, system_memory, s);
- omap_mpui_init(system_memory, 0xfffec900, s);
+ omap_mpui_init(parent, system_memory, 0xfffec900, s);
- s->private_tipb = omap_tipb_bridge_init(system_memory, 0xfffeca00,
+ s->private_tipb = omap_tipb_bridge_init(parent, system_memory, 0xfffeca00,
qdev_get_gpio_in(s->ih[0], OMAP_INT_BRIDGE_PRIV),
omap_findclk(s, "tipb_ck"));
- s->public_tipb = omap_tipb_bridge_init(system_memory, 0xfffed300,
+ s->public_tipb = omap_tipb_bridge_init(parent, system_memory, 0xfffed300,
qdev_get_gpio_in(s->ih[0], OMAP_INT_BRIDGE_PUB),
omap_findclk(s, "tipb_ck"));
- omap_tcmi_init(system_memory, 0xfffecc00, s);
+ omap_tcmi_init(parent, system_memory, 0xfffecc00, s);
s->uart[0] = omap_uart_init(parent, 0xfffb0000,
qdev_get_gpio_in(s->ih[1], OMAP_INT_UART1),
@@ -3864,11 +3877,11 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
"uart3",
serial_hd(0) && serial_hd(1) ? serial_hd(2) : NULL);
- s->dpll[0] = omap_dpll_init(system_memory, 0xfffecf00,
+ s->dpll[0] = omap_dpll_init(parent, system_memory, 0xfffecf00,
omap_findclk(s, "dpll1"));
- s->dpll[1] = omap_dpll_init(system_memory, 0xfffed000,
+ s->dpll[1] = omap_dpll_init(parent, system_memory, 0xfffed000,
omap_findclk(s, "dpll2"));
- s->dpll[2] = omap_dpll_init(system_memory, 0xfffed100,
+ s->dpll[2] = omap_dpll_init(parent, system_memory, 0xfffed100,
omap_findclk(s, "dpll3"));
dinfo = drive_get(IF_SD, 0, 0);
@@ -3895,7 +3908,7 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
&error_fatal);
}
- s->mpuio = omap_mpuio_init(system_memory, 0xfffb5000,
+ s->mpuio = omap_mpuio_init(parent, system_memory, 0xfffb5000,
qdev_get_gpio_in(s->ih[1], OMAP_INT_KEYBOARD),
qdev_get_gpio_in(s->ih[1], OMAP_INT_MPUIO),
omap_findclk(s, "clk32-kHz"));
@@ -3907,14 +3920,14 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
qdev_get_gpio_in(s->ih[0], OMAP_INT_GPIO_BANK1));
sysbus_mmio_map(SYS_BUS_DEVICE(s->gpio), 0, 0xfffce000);
- s->microwire = omap_uwire_init(system_memory, 0xfffb3000,
+ s->microwire = omap_uwire_init(parent, system_memory, 0xfffb3000,
qdev_get_gpio_in(s->ih[1], OMAP_INT_uWireTX),
qdev_get_gpio_in(s->ih[1], OMAP_INT_uWireRX),
s->drq[OMAP_DMA_UWIRE_TX], omap_findclk(s, "mpuper_ck"));
- s->pwl = omap_pwl_init(system_memory, 0xfffb5800,
+ s->pwl = omap_pwl_init(parent, system_memory, 0xfffb5800,
omap_findclk(s, "armxor_ck"));
- s->pwt = omap_pwt_init(system_memory, 0xfffb6000,
+ s->pwt = omap_pwt_init(parent, system_memory, 0xfffb6000,
omap_findclk(s, "armxor_ck"));
s->i2c[0] = qdev_new(parent, "i2c", "omap_i2c");
@@ -3927,29 +3940,29 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
sysbus_connect_irq(busdev, 2, s->drq[OMAP_DMA_I2C_RX]);
sysbus_mmio_map(busdev, 0, 0xfffb3800);
- s->rtc = omap_rtc_init(system_memory, 0xfffb4800,
+ s->rtc = omap_rtc_init(parent, system_memory, 0xfffb4800,
qdev_get_gpio_in(s->ih[1], OMAP_INT_RTC_TIMER),
qdev_get_gpio_in(s->ih[1], OMAP_INT_RTC_ALARM),
omap_findclk(s, "clk32-kHz"));
- s->mcbsp1 = omap_mcbsp_init(system_memory, 0xfffb1800,
+ s->mcbsp1 = omap_mcbsp_init(parent, system_memory, 0xfffb1800,
qdev_get_gpio_in(s->ih[1], OMAP_INT_McBSP1TX),
qdev_get_gpio_in(s->ih[1], OMAP_INT_McBSP1RX),
&s->drq[OMAP_DMA_MCBSP1_TX], omap_findclk(s, "dspxor_ck"));
- s->mcbsp2 = omap_mcbsp_init(system_memory, 0xfffb1000,
+ s->mcbsp2 = omap_mcbsp_init(parent, system_memory, 0xfffb1000,
qdev_get_gpio_in(s->ih[0],
OMAP_INT_310_McBSP2_TX),
qdev_get_gpio_in(s->ih[0],
OMAP_INT_310_McBSP2_RX),
&s->drq[OMAP_DMA_MCBSP2_TX], omap_findclk(s, "mpuper_ck"));
- s->mcbsp3 = omap_mcbsp_init(system_memory, 0xfffb7000,
+ s->mcbsp3 = omap_mcbsp_init(parent, system_memory, 0xfffb7000,
qdev_get_gpio_in(s->ih[1], OMAP_INT_McBSP3TX),
qdev_get_gpio_in(s->ih[1], OMAP_INT_McBSP3RX),
&s->drq[OMAP_DMA_MCBSP3_TX], omap_findclk(s, "dspxor_ck"));
- s->led[0] = omap_lpg_init(system_memory,
+ s->led[0] = omap_lpg_init(parent, system_memory,
0xfffbd000, omap_findclk(s, "clk32-kHz"));
- s->led[1] = omap_lpg_init(system_memory,
+ s->led[1] = omap_lpg_init(parent, system_memory,
0xfffbd800, omap_findclk(s, "clk32-kHz"));
/* Register mappings not currently implemented:
@@ -3967,8 +3980,8 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
* DSP MMU fffed200 - fffed2ff
*/
- omap_setup_dsp_mapping(system_memory, omap15xx_dsp_mm);
- omap_setup_mpui_io(system_memory, s);
+ omap_setup_dsp_mapping(parent, system_memory, omap15xx_dsp_mm);
+ omap_setup_mpui_io(parent, system_memory, s);
qemu_register_reset(omap1_mpu_reset, s);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 096/134] hw/sh4: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (94 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 095/134] hw/arm/omap1: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 097/134] hw/m68k: " Alexander Graf
` (38 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert memory_region_init*() calls in the SH7750 SoC model and
its non-QOM sub-block helpers (tmu012_init, sh_intc_init,
r2d_fpga_init) to pass an explicit owner instead of NULL.
Thread Object *owner as the first argument through tmu012_init(),
sh_intc_init() and its static sh_intc_register() helper, and
r2d_fpga_init(). sh7750_init() already carries an Object *parent
from the earlier device conversion; pass it through.
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/intc/sh_intc.c | 19 ++++++++++---------
hw/sh4/r2d.c | 9 +++++----
hw/sh4/sh7750.c | 22 +++++++++++-----------
hw/timer/sh_timer.c | 9 +++++----
include/hw/sh4/sh_intc.h | 3 ++-
include/hw/timer/tmu012.h | 3 ++-
6 files changed, 35 insertions(+), 30 deletions(-)
diff --git a/hw/intc/sh_intc.c b/hw/intc/sh_intc.c
index 0da82f9d5e..37feb6a813 100644
--- a/hw/intc/sh_intc.c
+++ b/hw/intc/sh_intc.c
@@ -349,7 +349,8 @@ void sh_intc_register_sources(struct intc_desc *desc,
}
}
-static unsigned int sh_intc_register(MemoryRegion *sysmem,
+static unsigned int sh_intc_register(Object *owner,
+ MemoryRegion *sysmem,
struct intc_desc *desc,
const unsigned long address,
const char *type,
@@ -368,18 +369,18 @@ static unsigned int sh_intc_register(MemoryRegion *sysmem,
iomem_a7 = iomem_p4 + 1;
snprintf(name, sizeof(name), "intc-%s-%s-%s", type, action, "p4");
- memory_region_init_alias(iomem_p4, NULL, name, iomem, A7ADDR(address), 4);
+ memory_region_init_alias(iomem_p4, owner, name, iomem, A7ADDR(address), 4);
memory_region_add_subregion(sysmem, P4ADDR(address), iomem_p4);
snprintf(name, sizeof(name), "intc-%s-%s-%s", type, action, "a7");
- memory_region_init_alias(iomem_a7, NULL, name, iomem, A7ADDR(address), 4);
+ memory_region_init_alias(iomem_a7, owner, name, iomem, A7ADDR(address), 4);
memory_region_add_subregion(sysmem, A7ADDR(address), iomem_a7);
/* used to increment aliases index */
return 2;
}
-int sh_intc_init(MemoryRegion *sysmem,
+int sh_intc_init(Object *owner, MemoryRegion *sysmem,
struct intc_desc *desc,
int nr_sources,
struct intc_mask_reg *mask_regs,
@@ -403,15 +404,15 @@ int sh_intc_init(MemoryRegion *sysmem,
desc->sources[i].parent = desc;
}
desc->irqs = qemu_allocate_irqs(sh_intc_set_irq, desc, nr_sources);
- memory_region_init_io(&desc->iomem, NULL, &sh_intc_ops, desc, "intc",
+ memory_region_init_io(&desc->iomem, owner, &sh_intc_ops, desc, "intc",
0x100000000ULL);
j = 0;
if (desc->mask_regs) {
for (i = 0; i < desc->nr_mask_regs; i++) {
struct intc_mask_reg *mr = &desc->mask_regs[i];
- j += sh_intc_register(sysmem, desc, mr->set_reg, "mask", "set", j);
- j += sh_intc_register(sysmem, desc, mr->clr_reg, "mask", "clr", j);
+ j += sh_intc_register(owner, sysmem, desc, mr->set_reg, "mask", "set", j);
+ j += sh_intc_register(owner, sysmem, desc, mr->clr_reg, "mask", "clr", j);
}
}
@@ -419,8 +420,8 @@ int sh_intc_init(MemoryRegion *sysmem,
for (i = 0; i < desc->nr_prio_regs; i++) {
struct intc_prio_reg *pr = &desc->prio_regs[i];
- j += sh_intc_register(sysmem, desc, pr->set_reg, "prio", "set", j);
- j += sh_intc_register(sysmem, desc, pr->clr_reg, "prio", "clr", j);
+ j += sh_intc_register(owner, sysmem, desc, pr->set_reg, "prio", "set", j);
+ j += sh_intc_register(owner, sysmem, desc, pr->clr_reg, "prio", "clr", j);
}
}
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index 6154aed2c4..8deda6e5f4 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -187,7 +187,8 @@ static const MemoryRegionOps r2d_fpga_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
-static r2d_fpga_t *r2d_fpga_init(MemoryRegion *sysmem,
+static r2d_fpga_t *r2d_fpga_init(Object *owner,
+ MemoryRegion *sysmem,
hwaddr base, qemu_irq irl)
{
r2d_fpga_t *s;
@@ -196,7 +197,7 @@ static r2d_fpga_t *r2d_fpga_init(MemoryRegion *sysmem,
s->irl = irl;
- memory_region_init_io(&s->iomem, NULL, &r2d_fpga_ops, s, "r2d-fpga", 0x40);
+ memory_region_init_io(&s->iomem, owner, &r2d_fpga_ops, s, "r2d-fpga", 0x40);
memory_region_add_subregion(sysmem, base, &s->iomem);
qemu_init_irqs(s->irq, NR_IRQS, r2d_fpga_irq_set, s);
@@ -261,11 +262,11 @@ static void r2d_init(MachineState *machine)
qemu_register_reset(main_cpu_reset, reset_info);
/* Allocate memory space */
- memory_region_init_ram(sdram, NULL, "r2d.sdram", SDRAM_SIZE, &error_fatal);
+ memory_region_init_ram(sdram, OBJECT(machine), "r2d.sdram", SDRAM_SIZE, &error_fatal);
memory_region_add_subregion(address_space_mem, SDRAM_BASE, sdram);
/* Register peripherals */
s = sh7750_init(OBJECT(machine), cpu, address_space_mem);
- fpga = r2d_fpga_init(address_space_mem, 0x04000000, sh7750_irl(s));
+ fpga = r2d_fpga_init(OBJECT(machine), address_space_mem, 0x04000000, sh7750_irl(s));
dev = qdev_new(OBJECT(machine), "pci-host", "sh_pci");
busdev = SYS_BUS_DEVICE(dev);
diff --git a/hw/sh4/sh7750.c b/hw/sh4/sh7750.c
index ff9724fadf..ea55a3a9cc 100644
--- a/hw/sh4/sh7750.c
+++ b/hw/sh4/sh7750.c
@@ -721,38 +721,38 @@ SH7750State *sh7750_init(Object *parent, SuperHCPU *cpu,
s = g_new0(SH7750State, 1);
s->cpu = cpu;
s->periph_freq = 60000000; /* 60MHz */
- memory_region_init_io(&s->iomem, NULL, &sh7750_mem_ops, s,
+ memory_region_init_io(&s->iomem, parent, &sh7750_mem_ops, s,
"memory", 0x1fc01000);
- memory_region_init_alias(&s->iomem_1f0, NULL, "memory-1f0",
+ memory_region_init_alias(&s->iomem_1f0, parent, "memory-1f0",
&s->iomem, 0x1f000000, 0x1000);
memory_region_add_subregion(sysmem, 0x1f000000, &s->iomem_1f0);
- memory_region_init_alias(&s->iomem_ff0, NULL, "memory-ff0",
+ memory_region_init_alias(&s->iomem_ff0, parent, "memory-ff0",
&s->iomem, 0x1f000000, 0x1000);
memory_region_add_subregion(sysmem, 0xff000000, &s->iomem_ff0);
- memory_region_init_alias(&s->iomem_1f8, NULL, "memory-1f8",
+ memory_region_init_alias(&s->iomem_1f8, parent, "memory-1f8",
&s->iomem, 0x1f800000, 0x1000);
memory_region_add_subregion(sysmem, 0x1f800000, &s->iomem_1f8);
- memory_region_init_alias(&s->iomem_ff8, NULL, "memory-ff8",
+ memory_region_init_alias(&s->iomem_ff8, parent, "memory-ff8",
&s->iomem, 0x1f800000, 0x1000);
memory_region_add_subregion(sysmem, 0xff800000, &s->iomem_ff8);
- memory_region_init_alias(&s->iomem_1fc, NULL, "memory-1fc",
+ memory_region_init_alias(&s->iomem_1fc, parent, "memory-1fc",
&s->iomem, 0x1fc00000, 0x1000);
memory_region_add_subregion(sysmem, 0x1fc00000, &s->iomem_1fc);
- memory_region_init_alias(&s->iomem_ffc, NULL, "memory-ffc",
+ memory_region_init_alias(&s->iomem_ffc, parent, "memory-ffc",
&s->iomem, 0x1fc00000, 0x1000);
memory_region_add_subregion(sysmem, 0xffc00000, &s->iomem_ffc);
- memory_region_init_io(&s->mmct_iomem, NULL, &sh7750_mmct_ops, s,
+ memory_region_init_io(&s->mmct_iomem, parent, &sh7750_mmct_ops, s,
"cache-and-tlb", 0x08000000);
memory_region_add_subregion(sysmem, 0xf0000000, &s->mmct_iomem);
- sh_intc_init(sysmem, &s->intc, NR_SOURCES,
+ sh_intc_init(parent, sysmem, &s->intc, NR_SOURCES,
_INTC_ARRAY(mask_registers),
_INTC_ARRAY(prio_registers));
@@ -797,7 +797,7 @@ SH7750State *sh7750_init(Object *parent, SuperHCPU *cpu,
qdev_connect_gpio_out_named(dev, "txi", 0, s->intc.irqs[SCIF_TXI]);
qdev_connect_gpio_out_named(dev, "bri", 0, s->intc.irqs[SCIF_BRI]);
- tmu012_init(sysmem, 0x1fd80000,
+ tmu012_init(parent, sysmem, 0x1fd80000,
TMU012_FEAT_TOCR | TMU012_FEAT_3CHAN | TMU012_FEAT_EXTCLK,
s->periph_freq,
s->intc.irqs[TMU0],
@@ -821,7 +821,7 @@ SH7750State *sh7750_init(Object *parent, SuperHCPU *cpu,
sh_intc_register_sources(&s->intc,
_INTC_ARRAY(vectors_tmu34),
NULL, 0);
- tmu012_init(sysmem, 0x1e100000, 0, s->periph_freq,
+ tmu012_init(parent, sysmem, 0x1e100000, 0, s->periph_freq,
s->intc.irqs[TMU3],
s->intc.irqs[TMU4],
NULL, NULL);
diff --git a/hw/timer/sh_timer.c b/hw/timer/sh_timer.c
index 41ece9c613..ac71d11a0a 100644
--- a/hw/timer/sh_timer.c
+++ b/hw/timer/sh_timer.c
@@ -344,7 +344,8 @@ static const MemoryRegionOps tmu012_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
-void tmu012_init(MemoryRegion *sysmem, hwaddr base, int feat, uint32_t freq,
+void tmu012_init(Object *owner, MemoryRegion *sysmem, hwaddr base,
+ int feat, uint32_t freq,
qemu_irq ch0_irq, qemu_irq ch1_irq,
qemu_irq ch2_irq0, qemu_irq ch2_irq1)
{
@@ -360,13 +361,13 @@ void tmu012_init(MemoryRegion *sysmem, hwaddr base, int feat, uint32_t freq,
ch2_irq0); /* ch2_irq1 not supported */
}
- memory_region_init_io(&s->iomem, NULL, &tmu012_ops, s, "timer", 0x30);
+ memory_region_init_io(&s->iomem, owner, &tmu012_ops, s, "timer", 0x30);
- memory_region_init_alias(&s->iomem_p4, NULL, "timer-p4",
+ memory_region_init_alias(&s->iomem_p4, owner, "timer-p4",
&s->iomem, 0, memory_region_size(&s->iomem));
memory_region_add_subregion(sysmem, P4ADDR(base), &s->iomem_p4);
- memory_region_init_alias(&s->iomem_a7, NULL, "timer-a7",
+ memory_region_init_alias(&s->iomem_a7, owner, "timer-a7",
&s->iomem, 0, memory_region_size(&s->iomem));
memory_region_add_subregion(sysmem, A7ADDR(base), &s->iomem_a7);
/* ??? Save/restore. */
diff --git a/include/hw/sh4/sh_intc.h b/include/hw/sh4/sh_intc.h
index 94f183121e..d391710987 100644
--- a/include/hw/sh4/sh_intc.h
+++ b/include/hw/sh4/sh_intc.h
@@ -2,6 +2,7 @@
#define SH_INTC_H
#include "system/memory.h"
+#include "qom/object.h"
typedef unsigned char intc_enum;
@@ -68,7 +69,7 @@ void sh_intc_register_sources(struct intc_desc *desc,
struct intc_group *groups,
int nr_groups);
-int sh_intc_init(MemoryRegion *sysmem,
+int sh_intc_init(Object *owner, MemoryRegion *sysmem,
struct intc_desc *desc,
int nr_sources,
struct intc_mask_reg *mask_regs,
diff --git a/include/hw/timer/tmu012.h b/include/hw/timer/tmu012.h
index 808ed8de1d..fb24c00d3b 100644
--- a/include/hw/timer/tmu012.h
+++ b/include/hw/timer/tmu012.h
@@ -10,12 +10,13 @@
#define HW_TIMER_TMU012_H
#include "exec/hwaddr.h"
+#include "qom/object.h"
#define TMU012_FEAT_TOCR (1 << 0)
#define TMU012_FEAT_3CHAN (1 << 1)
#define TMU012_FEAT_EXTCLK (1 << 2)
-void tmu012_init(MemoryRegion *sysmem, hwaddr base,
+void tmu012_init(Object *owner, MemoryRegion *sysmem, hwaddr base,
int feat, uint32_t freq,
qemu_irq ch0_irq, qemu_irq ch1_irq,
qemu_irq ch2_irq0, qemu_irq ch2_irq1);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 097/134] hw/m68k: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (95 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 096/134] hw/sh4: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-12 14:20 ` Thomas Huth
2026-07-11 22:36 ` [RFC PATCH 098/134] hw/ppc: " Alexander Graf
` (37 subsequent siblings)
134 siblings, 1 reply; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert memory_region_init*() calls that pass NULL owner to pass
the enclosing machine or device instead.
Thread Object *owner through the static mcf5208_sys_init() helper. mcf5206_mbar_realize() already has DeviceState *dev in scope.
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/m68k/an5206.c | 2 +-
hw/m68k/mcf5206.c | 2 +-
hw/m68k/mcf5208.c | 15 ++++++++-------
hw/m68k/next-cube.c | 10 +++++-----
hw/m68k/q800.c | 10 +++++-----
5 files changed, 20 insertions(+), 19 deletions(-)
diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
index 5027311cad..6c6c7d7248 100644
--- a/hw/m68k/an5206.c
+++ b/hw/m68k/an5206.c
@@ -60,7 +60,7 @@ static void an5206_init(MachineState *machine)
memory_region_add_subregion(address_space_mem, 0, machine->ram);
/* Internal SRAM. */
- memory_region_init_ram(sram, NULL, "an5206.sram", 512, &error_fatal);
+ memory_region_init_ram(sram, OBJECT(machine), "an5206.sram", 512, &error_fatal);
memory_region_add_subregion(address_space_mem, AN5206_RAMBAR_ADDR, sram);
mcf5206_init(OBJECT(machine), cpu, address_space_mem, AN5206_MBAR_ADDR);
diff --git a/hw/m68k/mcf5206.c b/hw/m68k/mcf5206.c
index b3c745d3f9..ee39a6ac30 100644
--- a/hw/m68k/mcf5206.c
+++ b/hw/m68k/mcf5206.c
@@ -589,7 +589,7 @@ static void mcf5206_mbar_realize(DeviceState *dev, Error **errp)
{
m5206_mbar_state *s = MCF5206_MBAR(dev);
- memory_region_init_io(&s->iomem, NULL, &m5206_mbar_ops, s,
+ memory_region_init_io(&s->iomem, OBJECT(dev), &m5206_mbar_ops, s,
"mbar", 0x00001000);
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
index a955efebeb..93aee5ebd5 100644
--- a/hw/m68k/mcf5208.c
+++ b/hw/m68k/mcf5208.c
@@ -227,7 +227,8 @@ static const MemoryRegionOps m5208_rcm_ops = {
.endianness = DEVICE_BIG_ENDIAN,
};
-static void mcf5208_sys_init(MemoryRegion *address_space, DeviceState *intc,
+static void mcf5208_sys_init(Object *owner, MemoryRegion *address_space,
+ DeviceState *intc,
M68kCPU *cpu)
{
MemoryRegion *iomem = g_new(MemoryRegion, 1);
@@ -236,17 +237,17 @@ static void mcf5208_sys_init(MemoryRegion *address_space, DeviceState *intc,
int i;
/* RCM */
- memory_region_init_io(iomem_rcm, NULL, &m5208_rcm_ops, cpu,
+ memory_region_init_io(iomem_rcm, owner, &m5208_rcm_ops, cpu,
"m5208-rcm", 0x00000080);
memory_region_add_subregion(address_space, 0xfc0a0000, iomem_rcm);
/* SDRAMC. */
- memory_region_init_io(iomem, NULL, &m5208_sys_ops, NULL, "m5208-sys", 0x00004000);
+ memory_region_init_io(iomem, owner, &m5208_sys_ops, NULL, "m5208-sys", 0x00004000);
memory_region_add_subregion(address_space, 0xfc0a8000, iomem);
/* Timers. */
for (i = 0; i < 2; i++) {
s = g_new0(m5208_timer_state, 1);
s->timer = ptimer_init(m5208_timer_trigger, s, PTIMER_POLICY_LEGACY);
- memory_region_init_io(&s->iomem, NULL, &m5208_timer_ops, s,
+ memory_region_init_io(&s->iomem, owner, &m5208_timer_ops, s,
"m5208-timer", 0x00004000);
memory_region_add_subregion(address_space, 0xfc080000 + 0x4000 * i,
&s->iomem);
@@ -296,14 +297,14 @@ static void mcf5208evb_init(MachineState *machine)
/* TODO: Configure BARs. */
/* ROM at 0x00000000 */
- memory_region_init_rom(rom, NULL, "mcf5208.rom", ROM_SIZE, &error_fatal);
+ memory_region_init_rom(rom, OBJECT(machine), "mcf5208.rom", ROM_SIZE, &error_fatal);
memory_region_add_subregion(address_space_mem, 0x00000000, rom);
/* DRAM at 0x40000000 */
memory_region_add_subregion(address_space_mem, 0x40000000, machine->ram);
/* Internal SRAM. */
- memory_region_init_ram(sram, NULL, "mcf5208.sram", 16 * KiB, &error_fatal);
+ memory_region_init_ram(sram, OBJECT(machine), "mcf5208.sram", 16 * KiB, &error_fatal);
memory_region_add_subregion(address_space_mem, 0x80000000, sram);
/* Internal peripherals. */
@@ -316,7 +317,7 @@ static void mcf5208evb_init(MachineState *machine)
mcf_uart_create_mmap(OBJECT(machine), 0xfc068000,
qdev_get_gpio_in(intc, 28), serial_hd(2));
- mcf5208_sys_init(address_space_mem, intc, cpu);
+ mcf5208_sys_init(OBJECT(machine), address_space_mem, intc, cpu);
mcf_fec_init(address_space_mem, 0xfc030000, intc);
diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c
index c80d32ef29..564a10a69e 100644
--- a/hw/m68k/next-cube.c
+++ b/hw/m68k/next-cube.c
@@ -1310,11 +1310,11 @@ static void next_cube_init(MachineState *machine)
sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 5, 0x0211a000);
/* BMAP memory */
- memory_region_init_ram_flags_nomigrate(&m->bmapm1, NULL, "next.bmapmem",
+ memory_region_init_ram_flags_nomigrate(&m->bmapm1, OBJECT(machine), "next.bmapmem",
64, RAM_SHARED, &error_fatal);
memory_region_add_subregion(sysmem, 0x020c0000, &m->bmapm1);
/* The Rev_2.5_v66.bin firmware accesses it at 0x820c0020, too */
- memory_region_init_alias(&m->bmapm2, NULL, "next.bmapmem2", &m->bmapm1,
+ memory_region_init_alias(&m->bmapm2, OBJECT(machine), "next.bmapmem2", &m->bmapm1,
0x0, 64);
memory_region_add_subregion(sysmem, 0x820c0000, &m->bmapm2);
@@ -1322,9 +1322,9 @@ static void next_cube_init(MachineState *machine)
sysbus_create_simple(OBJECT(machine), "kbd", TYPE_NEXTKBD, 0x0200e000, NULL);
/* Load ROM here */
- memory_region_init_rom(&m->rom, NULL, "next.rom", 0x20000, &error_fatal);
+ memory_region_init_rom(&m->rom, OBJECT(machine), "next.rom", 0x20000, &error_fatal);
memory_region_add_subregion(sysmem, 0x01000000, &m->rom);
- memory_region_init_alias(&m->rom2, NULL, "next.rom2", &m->rom, 0x0,
+ memory_region_init_alias(&m->rom2, OBJECT(machine), "next.rom2", &m->rom, 0x0,
0x20000);
memory_region_add_subregion(sysmem, 0x0, &m->rom2);
Error *local_err = NULL;
@@ -1352,7 +1352,7 @@ static void next_cube_init(MachineState *machine)
}
/* DMA */
- memory_region_init_io(&m->dmamem, NULL, &next_dma_ops, machine,
+ memory_region_init_io(&m->dmamem, OBJECT(machine), &next_dma_ops, machine,
"next.dma", 0x5000);
memory_region_add_subregion(sysmem, 0x02000000, &m->dmamem);
}
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 15b3bcab5f..954cdf8489 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -309,7 +309,7 @@ static void q800_machine_init(MachineState *machine)
memory_region_add_subregion(get_system_memory(), IO_BASE + IO_SLICE,
&m->macio_alias);
- memory_region_init_io(&m->machine_id, NULL, &machine_id_ops, NULL,
+ memory_region_init_io(&m->machine_id, OBJECT(machine), &machine_id_ops, NULL,
"Machine ID", 4);
memory_region_add_subregion(get_system_memory(), 0x5ffffffc,
&m->machine_id);
@@ -407,7 +407,7 @@ static void q800_machine_init(MachineState *machine)
sysbus_connect_irq(sysbus, 0,
qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_SONIC));
- memory_region_init_rom(&m->dp8393x_prom, NULL, "dp8393x-q800.prom",
+ memory_region_init_rom(&m->dp8393x_prom, OBJECT(machine), "dp8393x-q800.prom",
SONIC_PROM_SIZE, &error_fatal);
memory_region_add_subregion(get_system_memory(), SONIC_PROM_BASE,
&m->dp8393x_prom);
@@ -606,7 +606,7 @@ static void q800_machine_init(MachineState *machine)
BOOTINFO1(param_ptr, BI_MAC_VROW, macfb_mode->stride);
BOOTINFO1(param_ptr, BI_MAC_SCCBASE, SCC_BASE);
- memory_region_init_ram_ptr(&m->rom, NULL, "m68k_fake_mac.rom",
+ memory_region_init_ram_ptr(&m->rom, OBJECT(machine), "m68k_fake_mac.rom",
sizeof(fake_mac_rom), fake_mac_rom);
memory_region_set_readonly(&m->rom, true);
memory_region_add_subregion(get_system_memory(), MACROM_ADDR, &m->rom);
@@ -651,12 +651,12 @@ static void q800_machine_init(MachineState *machine)
} else {
uint8_t *ptr;
/* allocate and load BIOS */
- memory_region_init_rom(&m->rom, NULL, "m68k_mac.rom", MACROM_SIZE,
+ memory_region_init_rom(&m->rom, OBJECT(machine), "m68k_mac.rom", MACROM_SIZE,
&error_abort);
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
memory_region_add_subregion(get_system_memory(), MACROM_ADDR, &m->rom);
- memory_region_init_alias(&m->rom_alias, NULL, "m68k_mac.rom-alias",
+ memory_region_init_alias(&m->rom_alias, OBJECT(machine), "m68k_mac.rom-alias",
&m->rom, 0, MACROM_SIZE);
memory_region_add_subregion(get_system_memory(), 0x40000000,
&m->rom_alias);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 097/134] hw/m68k: Give memory regions an explicit owner
2026-07-11 22:36 ` [RFC PATCH 097/134] hw/m68k: " Alexander Graf
@ 2026-07-12 14:20 ` Thomas Huth
0 siblings, 0 replies; 156+ messages in thread
From: Thomas Huth @ 2026-07-12 14:20 UTC (permalink / raw)
To: Alexander Graf
Cc: qemu-devel, qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Ran Wang, Hao Wu,
Daniel P . Berrangé
Am Sat, 11 Jul 2026 22:36:30 +0000
schrieb Alexander Graf <graf@amazon.com>:
> Convert memory_region_init*() calls that pass NULL owner to pass
> the enclosing machine or device instead.
>
> Thread Object *owner through the static mcf5208_sys_init() helper. mcf5206_mbar_realize() already has DeviceState *dev in scope.
>
> No functional change intended.
>
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
> hw/m68k/an5206.c | 2 +-
> hw/m68k/mcf5206.c | 2 +-
> hw/m68k/mcf5208.c | 15 ++++++++-------
> hw/m68k/next-cube.c | 10 +++++-----
> hw/m68k/q800.c | 10 +++++-----
> 5 files changed, 20 insertions(+), 19 deletions(-)
For the coldfire and next-cube machine:
Reviewed-by: Thomas Huth <th.huth+qemu@posteo.eu>
q800 is a versioned machine type, though, so I hope Laurent can give some
guidance here whether it's ok to change the QOM tree here or not with
regards to migration.
Thomas
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 098/134] hw/ppc: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (96 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 097/134] hw/m68k: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 099/134] hw/tricore: " Alexander Graf
` (36 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert memory_region_init*() calls that pass NULL owner to pass
the enclosing machine or device instead.
Thread Object *owner through ppc4xx_l2sram_init() (called from sam460ex board init) and the static ppc4xx_sdram_banks() / sdram_bank_map() / sdram_bank_set_bcr() helpers (called from ppc4xx-sdram-ddr[2] realize and DCR write callbacks that already carry the device state).
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/ppc/amigaone.c | 6 +++---
hw/ppc/mac_newworld.c | 2 +-
hw/ppc/mac_oldworld.c | 2 +-
hw/ppc/pegasos.c | 2 +-
hw/ppc/ppc440.h | 2 +-
hw/ppc/ppc440_bamboo.c | 2 +-
hw/ppc/ppc440_uc.c | 10 +++++-----
hw/ppc/ppc4xx_sdram.c | 34 +++++++++++++++++-----------------
hw/ppc/prep.c | 2 +-
hw/ppc/sam460ex.c | 4 ++--
10 files changed, 33 insertions(+), 33 deletions(-)
diff --git a/hw/ppc/amigaone.c b/hw/ppc/amigaone.c
index 60aed15a6e..4a4e52c1fe 100644
--- a/hw/ppc/amigaone.c
+++ b/hw/ppc/amigaone.c
@@ -130,7 +130,7 @@ static void nvram_realize(DeviceState *dev, Error **errp)
void *p;
uint32_t crc, *c;
- memory_region_init_rom_device(&s->mr, NULL, &nvram_ops, s, "nvram",
+ memory_region_init_rom_device(&s->mr, OBJECT(dev), &nvram_ops, s, "nvram",
NVRAM_SIZE, &error_fatal);
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mr);
c = p = memory_region_get_ram_ptr(&s->mr);
@@ -297,7 +297,7 @@ static void amigaone_init(MachineState *machine)
if (machine->ram_size < 1 * GiB + 32 * KiB) {
/* Firmware uses this area for startup */
mr = g_new(MemoryRegion, 1);
- memory_region_init_ram(mr, NULL, "init-cache", 32 * KiB, &error_fatal);
+ memory_region_init_ram(mr, OBJECT(machine), "init-cache", 32 * KiB, &error_fatal);
memory_region_add_subregion(get_system_memory(), INIT_RAM_ADDR, mr);
}
@@ -313,7 +313,7 @@ static void amigaone_init(MachineState *machine)
/* allocate and load firmware */
rom = g_new(MemoryRegion, 1);
- memory_region_init_rom(rom, NULL, "rom", PROM_SIZE, &error_fatal);
+ memory_region_init_rom(rom, OBJECT(machine), "rom", PROM_SIZE, &error_fatal);
memory_region_add_subregion(get_system_memory(), PROM_ADDR, rom);
if (!machine->firmware) {
rom_add_blob_fixed("dummy-fw", dummy_fw, sizeof(dummy_fw),
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index a6af53e21a..392a1fb87d 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -176,7 +176,7 @@ static void ppc_core99_init(MachineState *machine)
memory_region_add_subregion(get_system_memory(), 0, machine->ram);
/* allocate and load firmware ROM */
- memory_region_init_rom(bios, NULL, "ppc_core99.bios", PROM_SIZE,
+ memory_region_init_rom(bios, OBJECT(machine), "ppc_core99.bios", PROM_SIZE,
&error_fatal);
memory_region_add_subregion(get_system_memory(), PROM_BASE, bios);
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index f9b62a518a..0fe8dfaf8c 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -130,7 +130,7 @@ static void ppc_heathrow_init(MachineState *machine)
memory_region_add_subregion(get_system_memory(), 0, machine->ram);
/* allocate and load firmware ROM */
- memory_region_init_rom(bios, NULL, "ppc_heathrow.bios", PROM_SIZE,
+ memory_region_init_rom(bios, OBJECT(machine), "ppc_heathrow.bios", PROM_SIZE,
&error_fatal);
memory_region_add_subregion(get_system_memory(), PROM_BASE, bios);
diff --git a/hw/ppc/pegasos.c b/hw/ppc/pegasos.c
index 4917d8137a..426a54d8ee 100644
--- a/hw/ppc/pegasos.c
+++ b/hw/ppc/pegasos.c
@@ -194,7 +194,7 @@ static void pegasos_init(MachineState *machine)
if (pm->type == PEGASOS1) {
prom_addr += PROM_SIZE;
}
- memory_region_init_rom(rom, NULL, "rom", PROM_SIZE, &error_fatal);
+ memory_region_init_rom(rom, OBJECT(machine), "rom", PROM_SIZE, &error_fatal);
memory_region_add_subregion(get_system_memory(), prom_addr, rom);
sz = load_elf(filename, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
ELFDATA2MSB, PPC_ELF_MACHINE, 0, 0);
diff --git a/hw/ppc/ppc440.h b/hw/ppc/ppc440.h
index 909373fb38..192b76adc4 100644
--- a/hw/ppc/ppc440.h
+++ b/hw/ppc/ppc440.h
@@ -13,7 +13,7 @@
#include "hw/ppc/ppc.h"
-void ppc4xx_l2sram_init(CPUPPCState *env);
+void ppc4xx_l2sram_init(Object *owner, CPUPPCState *env);
void ppc4xx_cpr_init(CPUPPCState *env);
void ppc4xx_sdr_init(CPUPPCState *env);
void ppc4xx_ahb_init(CPUPPCState *env);
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 2d9efeba77..5aad2a504b 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -194,7 +194,7 @@ static void bamboo_init(MachineState *machine)
exit(1);
}
- memory_region_init_alias(isa, NULL, "isa_mmio",
+ memory_region_init_alias(isa, OBJECT(machine), "isa_mmio",
get_system_io(), 0, PPC440EP_PCI_IOLEN);
memory_region_add_subregion(get_system_memory(), PPC440EP_PCI_IO, isa);
diff --git a/hw/ppc/ppc440_uc.c b/hw/ppc/ppc440_uc.c
index 016c756c19..e86519326e 100644
--- a/hw/ppc/ppc440_uc.c
+++ b/hw/ppc/ppc440_uc.c
@@ -167,19 +167,19 @@ static void l2sram_reset(void *opaque)
memset(l2sram->isram0, 0, sizeof(l2sram->isram0));
}
-void ppc4xx_l2sram_init(CPUPPCState *env)
+void ppc4xx_l2sram_init(Object *owner, CPUPPCState *env)
{
ppc4xx_l2sram_t *l2sram;
l2sram = g_malloc0(sizeof(*l2sram));
/* XXX: Size is 4*64kB for 460ex, cf. U-Boot, ppc4xx-isram.h */
- memory_region_init_ram(&l2sram->bank[0], NULL, "ppc4xx.l2sram_bank0",
+ memory_region_init_ram(&l2sram->bank[0], owner, "ppc4xx.l2sram_bank0",
64 * KiB, &error_abort);
- memory_region_init_ram(&l2sram->bank[1], NULL, "ppc4xx.l2sram_bank1",
+ memory_region_init_ram(&l2sram->bank[1], owner, "ppc4xx.l2sram_bank1",
64 * KiB, &error_abort);
- memory_region_init_ram(&l2sram->bank[2], NULL, "ppc4xx.l2sram_bank2",
+ memory_region_init_ram(&l2sram->bank[2], owner, "ppc4xx.l2sram_bank2",
64 * KiB, &error_abort);
- memory_region_init_ram(&l2sram->bank[3], NULL, "ppc4xx.l2sram_bank3",
+ memory_region_init_ram(&l2sram->bank[3], owner, "ppc4xx.l2sram_bank3",
64 * KiB, &error_abort);
qemu_register_reset(&l2sram_reset, l2sram);
ppc_dcr_register(env, DCR_L2CACHE_CFG,
diff --git a/hw/ppc/ppc4xx_sdram.c b/hw/ppc/ppc4xx_sdram.c
index b2c8f96d5f..8be3bb3160 100644
--- a/hw/ppc/ppc4xx_sdram.c
+++ b/hw/ppc/ppc4xx_sdram.c
@@ -53,7 +53,7 @@
* must be one of a small set of sizes. The number of banks and the supported
* sizes varies by SoC.
*/
-static bool ppc4xx_sdram_banks(MemoryRegion *ram, int nr_banks,
+static bool ppc4xx_sdram_banks(Object *owner, MemoryRegion *ram, int nr_banks,
Ppc4xxSdramBank ram_banks[],
const ram_addr_t sdram_bank_sizes[],
Error **errp)
@@ -76,7 +76,7 @@ static bool ppc4xx_sdram_banks(MemoryRegion *ram, int nr_banks,
base += bank_size;
size_left -= bank_size;
snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
- memory_region_init_alias(&ram_banks[i].ram, NULL, name, ram,
+ memory_region_init_alias(&ram_banks[i].ram, owner, name, ram,
ram_banks[i].base, ram_banks[i].size);
break;
}
@@ -108,10 +108,10 @@ static bool ppc4xx_sdram_banks(MemoryRegion *ram, int nr_banks,
return true;
}
-static void sdram_bank_map(Ppc4xxSdramBank *bank)
+static void sdram_bank_map(Object *owner, Ppc4xxSdramBank *bank)
{
trace_ppc4xx_sdram_map(bank->base, bank->size);
- memory_region_init(&bank->container, NULL, "sdram-container", bank->size);
+ memory_region_init(&bank->container, owner, "sdram-container", bank->size);
memory_region_add_subregion(&bank->container, 0, &bank->ram);
memory_region_add_subregion(get_system_memory(), bank->base,
&bank->container);
@@ -125,7 +125,7 @@ static void sdram_bank_unmap(Ppc4xxSdramBank *bank)
object_unparent(OBJECT(&bank->container));
}
-static void sdram_bank_set_bcr(Ppc4xxSdramBank *bank, uint32_t bcr,
+static void sdram_bank_set_bcr(Object *owner, Ppc4xxSdramBank *bank, uint32_t bcr,
hwaddr base, hwaddr size, int enabled)
{
if (memory_region_is_mapped(&bank->container)) {
@@ -135,7 +135,7 @@ static void sdram_bank_set_bcr(Ppc4xxSdramBank *bank, uint32_t bcr,
bank->base = base;
bank->size = size;
if (enabled && (bcr & 1)) {
- sdram_bank_map(bank);
+ sdram_bank_map(owner, bank);
}
}
@@ -296,7 +296,7 @@ static void sdram_ddr_dcr_write(void *opaque, int dcrn, uint32_t val)
/* validate all RAM mappings */
for (i = 0; i < s->nbanks; i++) {
if (s->bank[i].size) {
- sdram_bank_set_bcr(&s->bank[i], s->bank[i].bcr,
+ sdram_bank_set_bcr(OBJECT(s), &s->bank[i], s->bank[i].bcr,
s->bank[i].base, s->bank[i].size,
1);
}
@@ -307,7 +307,7 @@ static void sdram_ddr_dcr_write(void *opaque, int dcrn, uint32_t val)
/* invalidate all RAM mappings */
for (i = 0; i < s->nbanks; i++) {
if (s->bank[i].size) {
- sdram_bank_set_bcr(&s->bank[i], s->bank[i].bcr,
+ sdram_bank_set_bcr(OBJECT(s), &s->bank[i], s->bank[i].bcr,
s->bank[i].base, s->bank[i].size,
0);
}
@@ -337,7 +337,7 @@ static void sdram_ddr_dcr_write(void *opaque, int dcrn, uint32_t val)
i = (s->addr - 0x40) / 4;
val &= SDRAM_DDR_BCR_MASK;
if (s->bank[i].size) {
- sdram_bank_set_bcr(&s->bank[i], val,
+ sdram_bank_set_bcr(OBJECT(s), &s->bank[i], val,
sdram_ddr_base(val), sdram_ddr_size(val),
s->cfg & 0x80000000);
}
@@ -400,17 +400,17 @@ static void ppc4xx_sdram_ddr_realize(DeviceState *dev, Error **errp)
error_setg(errp, "Missing dram memory region");
return;
}
- if (!ppc4xx_sdram_banks(s->dram_mr, s->nbanks, s->bank,
+ if (!ppc4xx_sdram_banks(OBJECT(s), s->dram_mr, s->nbanks, s->bank,
valid_bank_sizes, errp)) {
return;
}
for (i = 0; i < s->nbanks; i++) {
if (s->bank[i].size) {
s->bank[i].bcr = sdram_ddr_bcr(s->bank[i].base, s->bank[i].size);
- sdram_bank_set_bcr(&s->bank[i], s->bank[i].bcr,
+ sdram_bank_set_bcr(OBJECT(s), &s->bank[i], s->bank[i].bcr,
s->bank[i].base, s->bank[i].size, 0);
} else {
- sdram_bank_set_bcr(&s->bank[i], 0, 0, 0, 0);
+ sdram_bank_set_bcr(OBJECT(s), &s->bank[i], 0, 0, 0, 0);
}
trace_ppc4xx_sdram_init(sdram_ddr_base(s->bank[i].bcr),
sdram_ddr_size(s->bank[i].bcr),
@@ -607,7 +607,7 @@ static void sdram_ddr2_dcr_write(void *opaque, int dcrn, uint32_t val)
/* validate all RAM mappings */
for (i = 0; i < s->nbanks; i++) {
if (s->bank[i].size) {
- sdram_bank_set_bcr(&s->bank[i], s->bank[i].bcr,
+ sdram_bank_set_bcr(OBJECT(s), &s->bank[i], s->bank[i].bcr,
s->bank[i].base, s->bank[i].size,
1);
}
@@ -619,7 +619,7 @@ static void sdram_ddr2_dcr_write(void *opaque, int dcrn, uint32_t val)
/* invalidate all RAM mappings */
for (i = 0; i < s->nbanks; i++) {
if (s->bank[i].size) {
- sdram_bank_set_bcr(&s->bank[i], s->bank[i].bcr,
+ sdram_bank_set_bcr(OBJECT(s), &s->bank[i], s->bank[i].bcr,
s->bank[i].base, s->bank[i].size,
0);
}
@@ -666,7 +666,7 @@ static void ppc4xx_sdram_ddr2_realize(DeviceState *dev, Error **errp)
error_setg(errp, "Missing dram memory region");
return;
}
- if (!ppc4xx_sdram_banks(s->dram_mr, s->nbanks, s->bank,
+ if (!ppc4xx_sdram_banks(OBJECT(s), s->dram_mr, s->nbanks, s->bank,
valid_bank_sizes, errp)) {
return;
}
@@ -674,10 +674,10 @@ static void ppc4xx_sdram_ddr2_realize(DeviceState *dev, Error **errp)
if (s->bank[i].size) {
s->bank[i].bcr = sdram_ddr2_bcr(s->bank[i].base, s->bank[i].size);
s->bank[i].bcr &= SDRAM_DDR2_BCR_MASK;
- sdram_bank_set_bcr(&s->bank[i], s->bank[i].bcr,
+ sdram_bank_set_bcr(OBJECT(s), &s->bank[i], s->bank[i].bcr,
s->bank[i].base, s->bank[i].size, 0);
} else {
- sdram_bank_set_bcr(&s->bank[i], 0, 0, 0, 0);
+ sdram_bank_set_bcr(OBJECT(s), &s->bank[i], 0, 0, 0, 0);
}
trace_ppc4xx_sdram_init(sdram_ddr2_base(s->bank[i].bcr),
sdram_ddr2_size(s->bank[i].bcr),
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 52f94b206a..c79736a1f3 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -274,7 +274,7 @@ static void ibm_40p_init(MachineState *machine)
error_report("Could not find bios image '%s'", bios_name);
exit(1);
}
- memory_region_init_rom(bios, NULL, "bios", BIOS_SIZE, &error_fatal);
+ memory_region_init_rom(bios, OBJECT(machine), "bios", BIOS_SIZE, &error_fatal);
memory_region_add_subregion(get_system_memory(), BIOS_ADDR, bios);
bios_size = load_elf(filename, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
ELFDATA2MSB, PPC_ELF_MACHINE, 0, 0);
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 59c217e2b2..20b2acb40b 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -375,9 +375,9 @@ static void sam460ex_init(MachineState *machine)
ppc4xx_dma_init(env, 0x200);
/* 256K of L2 cache as memory */
- ppc4xx_l2sram_init(env);
+ ppc4xx_l2sram_init(OBJECT(machine), env);
/* FIXME: remove this after fixing l2sram mapping in ppc440_uc.c? */
- memory_region_init_ram(l2cache_ram, NULL, "ppc440.l2cache_ram", 256 * KiB,
+ memory_region_init_ram(l2cache_ram, OBJECT(machine), "ppc440.l2cache_ram", 256 * KiB,
&error_abort);
memory_region_add_subregion(get_system_memory(), 0x400000000LL,
l2cache_ram);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 099/134] hw/tricore: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (97 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 098/134] hw/ppc: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 100/134] hw/xtensa: " Alexander Graf
` (35 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert memory_region_init*() calls that pass NULL owner to pass
the enclosing machine or device instead.
Thread Object *owner through the static make_rom() / make_ram() / make_alias() helpers in tc27x_soc.c. All callers are inside tc27x_soc_init_memory_mapping(DeviceState *dev_soc).
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/tricore/tc27x_soc.c | 77 +++++++++++++++++-----------------
hw/tricore/tricore_testboard.c | 12 +++---
2 files changed, 45 insertions(+), 44 deletions(-)
diff --git a/hw/tricore/tc27x_soc.c b/hw/tricore/tc27x_soc.c
index 5b1b07cee1..0475698b29 100644
--- a/hw/tricore/tc27x_soc.c
+++ b/hw/tricore/tc27x_soc.c
@@ -67,10 +67,10 @@ const MemmapEntry tc27x_soc_memmap[] = {
* Initialize the auxiliary ROM region @mr and map it into
* the memory map at @base.
*/
-static void make_rom(MemoryRegion *mr, const char *name,
+static void make_rom(Object *owner, MemoryRegion *mr, const char *name,
hwaddr base, hwaddr size)
{
- memory_region_init_rom(mr, NULL, name, size, &error_fatal);
+ memory_region_init_rom(mr, owner, name, size, &error_fatal);
memory_region_add_subregion(get_system_memory(), base, mr);
}
@@ -78,10 +78,10 @@ static void make_rom(MemoryRegion *mr, const char *name,
* Initialize the auxiliary RAM region @mr and map it into
* the memory map at @base.
*/
-static void make_ram(MemoryRegion *mr, const char *name,
+static void make_ram(Object *owner, MemoryRegion *mr, const char *name,
hwaddr base, hwaddr size)
{
- memory_region_init_ram(mr, NULL, name, size, &error_fatal);
+ memory_region_init_ram(mr, owner, name, size, &error_fatal);
memory_region_add_subregion(get_system_memory(), base, mr);
}
@@ -89,10 +89,10 @@ static void make_ram(MemoryRegion *mr, const char *name,
* Create an alias of an entire original MemoryRegion @orig
* located at @base in the memory map.
*/
-static void make_alias(MemoryRegion *mr, const char *name,
+static void make_alias(Object *owner, MemoryRegion *mr, const char *name,
MemoryRegion *orig, hwaddr base)
{
- memory_region_init_alias(mr, NULL, name, orig, 0,
+ memory_region_init_alias(mr, owner, name, orig, 0,
memory_region_size(orig));
memory_region_add_subregion(get_system_memory(), base, mr);
}
@@ -101,81 +101,82 @@ static void tc27x_soc_init_memory_mapping(DeviceState *dev_soc)
{
TC27XSoCState *s = TC27X_SOC(dev_soc);
TC27XSoCClass *sc = TC27X_SOC_GET_CLASS(s);
+ Object *obj = OBJECT(dev_soc);
- make_ram(&s->cpu0mem.dspr, "CPU0.DSPR",
+ make_ram(obj, &s->cpu0mem.dspr, "CPU0.DSPR",
sc->memmap[TC27XD_DSPR0].base, sc->memmap[TC27XD_DSPR0].size);
- make_ram(&s->cpu0mem.pspr, "CPU0.PSPR",
+ make_ram(obj, &s->cpu0mem.pspr, "CPU0.PSPR",
sc->memmap[TC27XD_PSPR0].base, sc->memmap[TC27XD_PSPR0].size);
- make_ram(&s->cpu1mem.dspr, "CPU1.DSPR",
+ make_ram(obj, &s->cpu1mem.dspr, "CPU1.DSPR",
sc->memmap[TC27XD_DSPR1].base, sc->memmap[TC27XD_DSPR1].size);
- make_ram(&s->cpu1mem.pspr, "CPU1.PSPR",
+ make_ram(obj, &s->cpu1mem.pspr, "CPU1.PSPR",
sc->memmap[TC27XD_PSPR1].base, sc->memmap[TC27XD_PSPR1].size);
- make_ram(&s->cpu2mem.dspr, "CPU2.DSPR",
+ make_ram(obj, &s->cpu2mem.dspr, "CPU2.DSPR",
sc->memmap[TC27XD_DSPR2].base, sc->memmap[TC27XD_DSPR2].size);
- make_ram(&s->cpu2mem.pspr, "CPU2.PSPR",
+ make_ram(obj, &s->cpu2mem.pspr, "CPU2.PSPR",
sc->memmap[TC27XD_PSPR2].base, sc->memmap[TC27XD_PSPR2].size);
/* TODO: Control Cache mapping with Memory Test Unit (MTU) */
- make_ram(&s->cpu2mem.dcache, "CPU2.DCACHE",
+ make_ram(obj, &s->cpu2mem.dcache, "CPU2.DCACHE",
sc->memmap[TC27XD_DCACHE2].base, sc->memmap[TC27XD_DCACHE2].size);
- make_ram(&s->cpu2mem.dtag, "CPU2.DTAG",
+ make_ram(obj, &s->cpu2mem.dtag, "CPU2.DTAG",
sc->memmap[TC27XD_DTAG2].base, sc->memmap[TC27XD_DTAG2].size);
- make_ram(&s->cpu2mem.pcache, "CPU2.PCACHE",
+ make_ram(obj, &s->cpu2mem.pcache, "CPU2.PCACHE",
sc->memmap[TC27XD_PCACHE2].base, sc->memmap[TC27XD_PCACHE2].size);
- make_ram(&s->cpu2mem.ptag, "CPU2.PTAG",
+ make_ram(obj, &s->cpu2mem.ptag, "CPU2.PTAG",
sc->memmap[TC27XD_PTAG2].base, sc->memmap[TC27XD_PTAG2].size);
- make_ram(&s->cpu1mem.dcache, "CPU1.DCACHE",
+ make_ram(obj, &s->cpu1mem.dcache, "CPU1.DCACHE",
sc->memmap[TC27XD_DCACHE1].base, sc->memmap[TC27XD_DCACHE1].size);
- make_ram(&s->cpu1mem.dtag, "CPU1.DTAG",
+ make_ram(obj, &s->cpu1mem.dtag, "CPU1.DTAG",
sc->memmap[TC27XD_DTAG1].base, sc->memmap[TC27XD_DTAG1].size);
- make_ram(&s->cpu1mem.pcache, "CPU1.PCACHE",
+ make_ram(obj, &s->cpu1mem.pcache, "CPU1.PCACHE",
sc->memmap[TC27XD_PCACHE1].base, sc->memmap[TC27XD_PCACHE1].size);
- make_ram(&s->cpu1mem.ptag, "CPU1.PTAG",
+ make_ram(obj, &s->cpu1mem.ptag, "CPU1.PTAG",
sc->memmap[TC27XD_PTAG1].base, sc->memmap[TC27XD_PTAG1].size);
- make_ram(&s->cpu0mem.pcache, "CPU0.PCACHE",
+ make_ram(obj, &s->cpu0mem.pcache, "CPU0.PCACHE",
sc->memmap[TC27XD_PCACHE0].base, sc->memmap[TC27XD_PCACHE0].size);
- make_ram(&s->cpu0mem.ptag, "CPU0.PTAG",
+ make_ram(obj, &s->cpu0mem.ptag, "CPU0.PTAG",
sc->memmap[TC27XD_PTAG0].base, sc->memmap[TC27XD_PTAG0].size);
/*
* TriCore QEMU executes CPU0 only, thus it is sufficient to map
* LOCAL.PSPR/LOCAL.DSPR exclusively onto PSPR0/DSPR0.
*/
- make_alias(&s->psprX, "LOCAL.PSPR", &s->cpu0mem.pspr,
+ make_alias(obj, &s->psprX, "LOCAL.PSPR", &s->cpu0mem.pspr,
sc->memmap[TC27XD_PSPRX].base);
- make_alias(&s->dsprX, "LOCAL.DSPR", &s->cpu0mem.dspr,
+ make_alias(obj, &s->dsprX, "LOCAL.DSPR", &s->cpu0mem.dspr,
sc->memmap[TC27XD_DSPRX].base);
- make_ram(&s->flashmem.pflash0_c, "PF0",
+ make_ram(obj, &s->flashmem.pflash0_c, "PF0",
sc->memmap[TC27XD_PFLASH0_C].base, sc->memmap[TC27XD_PFLASH0_C].size);
- make_ram(&s->flashmem.pflash1_c, "PF1",
+ make_ram(obj, &s->flashmem.pflash1_c, "PF1",
sc->memmap[TC27XD_PFLASH1_C].base, sc->memmap[TC27XD_PFLASH1_C].size);
- make_ram(&s->flashmem.dflash0, "DF0",
+ make_ram(obj, &s->flashmem.dflash0, "DF0",
sc->memmap[TC27XD_DFLASH0].base, sc->memmap[TC27XD_DFLASH0].size);
- make_ram(&s->flashmem.dflash1, "DF1",
+ make_ram(obj, &s->flashmem.dflash1, "DF1",
sc->memmap[TC27XD_DFLASH1].base, sc->memmap[TC27XD_DFLASH1].size);
- make_ram(&s->flashmem.olda_c, "OLDA",
+ make_ram(obj, &s->flashmem.olda_c, "OLDA",
sc->memmap[TC27XD_OLDA_C].base, sc->memmap[TC27XD_OLDA_C].size);
- make_rom(&s->flashmem.brom_c, "BROM",
+ make_rom(obj, &s->flashmem.brom_c, "BROM",
sc->memmap[TC27XD_BROM_C].base, sc->memmap[TC27XD_BROM_C].size);
- make_ram(&s->flashmem.lmuram_c, "LMURAM",
+ make_ram(obj, &s->flashmem.lmuram_c, "LMURAM",
sc->memmap[TC27XD_LMURAM_C].base, sc->memmap[TC27XD_LMURAM_C].size);
- make_ram(&s->flashmem.emem_c, "EMEM",
+ make_ram(obj, &s->flashmem.emem_c, "EMEM",
sc->memmap[TC27XD_EMEM_C].base, sc->memmap[TC27XD_EMEM_C].size);
- make_alias(&s->flashmem.pflash0_u, "PF0.U", &s->flashmem.pflash0_c,
+ make_alias(obj, &s->flashmem.pflash0_u, "PF0.U", &s->flashmem.pflash0_c,
sc->memmap[TC27XD_PFLASH0_U].base);
- make_alias(&s->flashmem.pflash1_u, "PF1.U", &s->flashmem.pflash1_c,
+ make_alias(obj, &s->flashmem.pflash1_u, "PF1.U", &s->flashmem.pflash1_c,
sc->memmap[TC27XD_PFLASH1_U].base);
- make_alias(&s->flashmem.olda_u, "OLDA.U", &s->flashmem.olda_c,
+ make_alias(obj, &s->flashmem.olda_u, "OLDA.U", &s->flashmem.olda_c,
sc->memmap[TC27XD_OLDA_U].base);
- make_alias(&s->flashmem.brom_u, "BROM.U", &s->flashmem.brom_c,
+ make_alias(obj, &s->flashmem.brom_u, "BROM.U", &s->flashmem.brom_c,
sc->memmap[TC27XD_BROM_U].base);
- make_alias(&s->flashmem.lmuram_u, "LMURAM.U", &s->flashmem.lmuram_c,
+ make_alias(obj, &s->flashmem.lmuram_u, "LMURAM.U", &s->flashmem.lmuram_c,
sc->memmap[TC27XD_LMURAM_U].base);
- make_alias(&s->flashmem.emem_u, "EMEM.U", &s->flashmem.emem_c,
+ make_alias(obj, &s->flashmem.emem_u, "EMEM.U", &s->flashmem.emem_c,
sc->memmap[TC27XD_EMEM_U].base);
}
diff --git a/hw/tricore/tricore_testboard.c b/hw/tricore/tricore_testboard.c
index 9e8cccbd59..4b5398ab95 100644
--- a/hw/tricore/tricore_testboard.c
+++ b/hw/tricore/tricore_testboard.c
@@ -70,17 +70,17 @@ static void tricore_testboard_init(MachineState *machine, int board_id)
cpu = TRICORE_CPU(cpu_create(mo, "cpu", machine->cpu_type));
env = &cpu->env;
- memory_region_init_ram(ext_cram, NULL, "powerlink_ext_c.ram",
+ memory_region_init_ram(ext_cram, OBJECT(machine), "powerlink_ext_c.ram",
2 * MiB, &error_fatal);
- memory_region_init_ram(ext_dram, NULL, "powerlink_ext_d.ram",
+ memory_region_init_ram(ext_dram, OBJECT(machine), "powerlink_ext_d.ram",
4 * MiB, &error_fatal);
- memory_region_init_ram(int_cram, NULL, "powerlink_int_c.ram", 48 * KiB,
+ memory_region_init_ram(int_cram, OBJECT(machine), "powerlink_int_c.ram", 48 * KiB,
&error_fatal);
- memory_region_init_ram(int_dram, NULL, "powerlink_int_d.ram", 48 * KiB,
+ memory_region_init_ram(int_dram, OBJECT(machine), "powerlink_int_d.ram", 48 * KiB,
&error_fatal);
- memory_region_init_ram(pcp_data, NULL, "powerlink_pcp_data.ram",
+ memory_region_init_ram(pcp_data, OBJECT(machine), "powerlink_pcp_data.ram",
16 * KiB, &error_fatal);
- memory_region_init_ram(pcp_text, NULL, "powerlink_pcp_text.ram",
+ memory_region_init_ram(pcp_text, OBJECT(machine), "powerlink_pcp_text.ram",
32 * KiB, &error_fatal);
memory_region_add_subregion(sysmem, 0x80000000, ext_cram);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 100/134] hw/xtensa: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (98 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 099/134] hw/tricore: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 101/134] hw/display: " Alexander Graf
` (34 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert memory_region_init*() calls that pass NULL owner to pass
the enclosing machine or device instead.
Thread Object *owner through xtensa_create_memory_regions(), xtensa_mx_pic_register_cpu() and the static xtfpga_fpga_init() helper. All callers are inside board init functions.
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/xtensa/mx_pic.c | 4 ++--
hw/xtensa/sim.c | 15 ++++++++-------
hw/xtensa/xtensa_memory.c | 5 +++--
hw/xtensa/xtensa_memory.h | 3 ++-
hw/xtensa/xtfpga.c | 30 ++++++++++++++++--------------
include/hw/xtensa/mx_pic.h | 2 +-
6 files changed, 32 insertions(+), 27 deletions(-)
diff --git a/hw/xtensa/mx_pic.c b/hw/xtensa/mx_pic.c
index 8ded3bc79b..f349fb125c 100644
--- a/hw/xtensa/mx_pic.c
+++ b/hw/xtensa/mx_pic.c
@@ -299,7 +299,7 @@ static const MemoryRegionOps xtensa_mx_pic_ops = {
},
};
-MemoryRegion *xtensa_mx_pic_register_cpu(XtensaMxPic *mx,
+MemoryRegion *xtensa_mx_pic_register_cpu(Object *owner, XtensaMxPic *mx,
qemu_irq *irq,
qemu_irq runstall)
{
@@ -309,7 +309,7 @@ MemoryRegion *xtensa_mx_pic_register_cpu(XtensaMxPic *mx,
mx_cpu->irq = irq;
mx_cpu->runstall = runstall;
- memory_region_init_io(&mx_cpu->reg, NULL, &xtensa_mx_pic_ops, mx_cpu,
+ memory_region_init_io(&mx_cpu->reg, owner, &xtensa_mx_pic_ops, mx_cpu,
"mx_pic", 0x280);
++mx->n_cpu;
diff --git a/hw/xtensa/sim.c b/hw/xtensa/sim.c
index ad1439a0b4..e3cd69ceca 100644
--- a/hw/xtensa/sim.c
+++ b/hw/xtensa/sim.c
@@ -60,10 +60,11 @@ XtensaCPU *xtensa_sim_common_init(MachineState *machine)
XtensaCPU *cpu = NULL;
CPUXtensaState *env = NULL;
ram_addr_t ram_size = machine->ram_size;
+ Object *mo = OBJECT(machine);
int n;
for (n = 0; n < machine->smp.cpus; n++) {
- cpu = XTENSA_CPU(cpu_create(OBJECT(machine), "cpu[*]", machine->cpu_type));
+ cpu = XTENSA_CPU(cpu_create(mo, "cpu[*]", machine->cpu_type));
env = &cpu->env;
env->sregs[PRID] = n;
@@ -78,17 +79,17 @@ XtensaCPU *xtensa_sim_common_init(MachineState *machine)
XtensaMemory sysram = env->config->sysram;
sysram.location[0].size = ram_size;
- xtensa_create_memory_regions(&env->config->instrom, "xtensa.instrom",
+ xtensa_create_memory_regions(mo, &env->config->instrom, "xtensa.instrom",
get_system_memory());
- xtensa_create_memory_regions(&env->config->instram, "xtensa.instram",
+ xtensa_create_memory_regions(mo, &env->config->instram, "xtensa.instram",
get_system_memory());
- xtensa_create_memory_regions(&env->config->datarom, "xtensa.datarom",
+ xtensa_create_memory_regions(mo, &env->config->datarom, "xtensa.datarom",
get_system_memory());
- xtensa_create_memory_regions(&env->config->dataram, "xtensa.dataram",
+ xtensa_create_memory_regions(mo, &env->config->dataram, "xtensa.dataram",
get_system_memory());
- xtensa_create_memory_regions(&env->config->sysrom, "xtensa.sysrom",
+ xtensa_create_memory_regions(mo, &env->config->sysrom, "xtensa.sysrom",
get_system_memory());
- xtensa_create_memory_regions(&sysram, "xtensa.sysram",
+ xtensa_create_memory_regions(mo, &sysram, "xtensa.sysram",
get_system_memory());
}
if (serial_hd(0)) {
diff --git a/hw/xtensa/xtensa_memory.c b/hw/xtensa/xtensa_memory.c
index 13a6077d86..4477eea0ad 100644
--- a/hw/xtensa/xtensa_memory.c
+++ b/hw/xtensa/xtensa_memory.c
@@ -31,7 +31,8 @@
#include "qemu/error-report.h"
#include "xtensa_memory.h"
-void xtensa_create_memory_regions(const XtensaMemory *memory,
+void xtensa_create_memory_regions(Object *owner,
+ const XtensaMemory *memory,
const char *name,
MemoryRegion *super)
{
@@ -43,7 +44,7 @@ void xtensa_create_memory_regions(const XtensaMemory *memory,
g_string_printf(num_name, "%s%u", name, i);
m = g_new(MemoryRegion, 1);
- memory_region_init_ram(m, NULL, num_name->str,
+ memory_region_init_ram(m, owner, num_name->str,
memory->location[i].size, &error_fatal);
memory_region_add_subregion(super, memory->location[i].addr, m);
}
diff --git a/hw/xtensa/xtensa_memory.h b/hw/xtensa/xtensa_memory.h
index c86ad06685..b8b2d4b8b4 100644
--- a/hw/xtensa/xtensa_memory.h
+++ b/hw/xtensa/xtensa_memory.h
@@ -30,7 +30,8 @@
#include "target/xtensa/cpu.h"
-void xtensa_create_memory_regions(const XtensaMemory *memory,
+void xtensa_create_memory_regions(Object *owner,
+ const XtensaMemory *memory,
const char *name,
MemoryRegion *super);
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index 1c48283f5d..f0c21180a2 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -125,12 +125,13 @@ static const MemoryRegionOps xtfpga_fpga_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
-static XtfpgaFpgaState *xtfpga_fpga_init(MemoryRegion *address_space,
+static XtfpgaFpgaState *xtfpga_fpga_init(Object *owner,
+ MemoryRegion *address_space,
hwaddr base, uint32_t freq)
{
XtfpgaFpgaState *s = g_new(XtfpgaFpgaState, 1);
- memory_region_init_io(&s->iomem, NULL, &xtfpga_fpga_ops, s,
+ memory_region_init_io(&s->iomem, owner, &xtfpga_fpga_ops, s,
"xtfpga.fpga", 0x10000);
memory_region_add_subregion(address_space, base, &s->iomem);
s->freq = freq;
@@ -243,6 +244,7 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
uint32_t freq = 10000000;
int n;
unsigned int smp_cpus = machine->smp.cpus;
+ Object *mo = OBJECT(machine);
if (smp_cpus > 1) {
mx_pic = xtensa_mx_pic_init(31);
@@ -262,7 +264,7 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
if (mx_pic) {
MemoryRegion *mx_eri;
- mx_eri = xtensa_mx_pic_register_cpu(mx_pic,
+ mx_eri = xtensa_mx_pic_register_cpu(OBJECT(machine), mx_pic,
xtensa_get_extints(cenv),
xtensa_get_runstall(cenv));
memory_region_add_subregion(xtensa_get_er_region(cenv),
@@ -286,30 +288,30 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
XtensaMemory sysram = env->config->sysram;
sysram.location[0].size = machine->ram_size;
- xtensa_create_memory_regions(&env->config->instrom, "xtensa.instrom",
+ xtensa_create_memory_regions(mo, &env->config->instrom, "xtensa.instrom",
system_memory);
- xtensa_create_memory_regions(&env->config->instram, "xtensa.instram",
+ xtensa_create_memory_regions(mo, &env->config->instram, "xtensa.instram",
system_memory);
- xtensa_create_memory_regions(&env->config->datarom, "xtensa.datarom",
+ xtensa_create_memory_regions(mo, &env->config->datarom, "xtensa.datarom",
system_memory);
- xtensa_create_memory_regions(&env->config->dataram, "xtensa.dataram",
+ xtensa_create_memory_regions(mo, &env->config->dataram, "xtensa.dataram",
system_memory);
- xtensa_create_memory_regions(&sysram, "xtensa.sysram",
+ xtensa_create_memory_regions(mo, &sysram, "xtensa.sysram",
system_memory);
}
system_io = g_malloc(sizeof(*system_io));
- memory_region_init_io(system_io, NULL, &xtfpga_io_ops, NULL, "xtfpga.io",
+ memory_region_init_io(system_io, OBJECT(machine), &xtfpga_io_ops, NULL, "xtfpga.io",
system_io_size);
memory_region_add_subregion(system_memory, board->io[0], system_io);
if (board->io[1]) {
MemoryRegion *io = g_malloc(sizeof(*io));
- memory_region_init_alias(io, NULL, "xtfpga.io.cached",
+ memory_region_init_alias(io, OBJECT(machine), "xtfpga.io.cached",
system_io, 0, system_io_size);
memory_region_add_subregion(system_memory, board->io[1], io);
}
- xtfpga_fpga_init(system_io, 0x0d020000, freq);
+ xtfpga_fpga_init(OBJECT(machine), system_io, 0x0d020000, freq);
xtfpga_net_init(system_io, 0x0d030000, 0x0d030400, 0x0d800000, extints[1]);
serial_mm_init(OBJECT(machine), system_io, 0x0d050020, 2, extints[0],
@@ -341,7 +343,7 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
lowmem_end += env->config->sysram.location[0].addr;
cur_lowmem += env->config->sysram.location[0].addr;
- xtensa_create_memory_regions(&env->config->sysrom, "xtensa.sysrom",
+ xtensa_create_memory_regions(mo, &env->config->sysrom, "xtensa.sysrom",
system_memory);
if (kernel_cmdline) {
@@ -465,13 +467,13 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
size = board->flash->size - board->flash->boot_base;
}
- memory_region_init_alias(flash_io, NULL, "xtfpga.flash",
+ memory_region_init_alias(flash_io, OBJECT(machine), "xtfpga.flash",
flash_mr, board->flash->boot_base, size);
memory_region_add_subregion(system_memory,
env->config->sysrom.location[0].addr,
flash_io);
} else {
- xtensa_create_memory_regions(&env->config->sysrom, "xtensa.sysrom",
+ xtensa_create_memory_regions(mo, &env->config->sysrom, "xtensa.sysrom",
system_memory);
}
}
diff --git a/include/hw/xtensa/mx_pic.h b/include/hw/xtensa/mx_pic.h
index cd316d86eb..01d5ea884e 100644
--- a/include/hw/xtensa/mx_pic.h
+++ b/include/hw/xtensa/mx_pic.h
@@ -35,7 +35,7 @@ typedef struct XtensaMxPic XtensaMxPic;
XtensaMxPic *xtensa_mx_pic_init(unsigned n_extint);
void xtensa_mx_pic_reset(void *opaque);
-MemoryRegion *xtensa_mx_pic_register_cpu(XtensaMxPic *mx,
+MemoryRegion *xtensa_mx_pic_register_cpu(Object *owner, XtensaMxPic *mx,
qemu_irq *irq,
qemu_irq runstall);
qemu_irq *xtensa_mx_pic_get_extints(XtensaMxPic *mx);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 101/134] hw/display: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (99 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 100/134] hw/xtensa: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 102/134] hw/arm/omap: Give lcdc and dma " Alexander Graf
` (33 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert memory_region_init*() calls in device realize functions
to pass OBJECT(dev) instead of NULL. All sites (cg3, g364fb,
virtio-gpu-gl, vmware_vga) already have the DeviceState in scope.
omap_lcdc is handled separately together with the other OMAP
peripherals.
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/display/cg3.c | 2 +-
hw/display/g364fb.c | 2 +-
hw/display/virtio-gpu-gl.c | 2 +-
hw/display/vmware_vga.c | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/hw/display/cg3.c b/hw/display/cg3.c
index f9dda1549d..507b0d8189 100644
--- a/hw/display/cg3.c
+++ b/hw/display/cg3.c
@@ -304,7 +304,7 @@ static void cg3_realizefn(DeviceState *dev, Error **errp)
}
}
- memory_region_init_ram(&s->vram_mem, NULL, "cg3.vram", s->vram_size,
+ memory_region_init_ram(&s->vram_mem, OBJECT(dev), "cg3.vram", s->vram_size,
&error_fatal);
memory_region_set_log(&s->vram_mem, true, DIRTY_MEMORY_VGA);
sysbus_init_mmio(sbd, &s->vram_mem);
diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c
index af54f1f900..0bd993b826 100644
--- a/hw/display/g364fb.c
+++ b/hw/display/g364fb.c
@@ -482,7 +482,7 @@ static void g364fb_init(DeviceState *dev, G364State *s)
memory_region_init_io(&s->mem_ctrl, OBJECT(dev), &g364fb_ctrl_ops, s,
"ctrl", 0x180000);
- memory_region_init_ram(&s->mem_vram, NULL, "g364fb.vram", s->vram_size,
+ memory_region_init_ram(&s->mem_vram, OBJECT(dev), "g364fb.vram", s->vram_size,
&error_fatal);
memory_region_set_log(&s->mem_vram, true, DIRTY_MEMORY_VGA);
}
diff --git a/hw/display/virtio-gpu-gl.c b/hw/display/virtio-gpu-gl.c
index 2b7a41c466..b6f183123d 100644
--- a/hw/display/virtio-gpu-gl.c
+++ b/hw/display/virtio-gpu-gl.c
@@ -153,7 +153,7 @@ static void virtio_gpu_gl_device_realize(DeviceState *qdev, Error **errp)
}
gl->hostmem_mmap = map;
- memory_region_init_ram_ptr(&gl->hostmem_background, NULL,
+ memory_region_init_ram_ptr(&gl->hostmem_background, OBJECT(qdev),
"hostmem-background", b->conf.hostmem,
gl->hostmem_mmap);
memory_region_add_subregion(&b->hostmem, 0, &gl->hostmem_background);
diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c
index f6f9edfd1d..0be124fa89 100644
--- a/hw/display/vmware_vga.c
+++ b/hw/display/vmware_vga.c
@@ -1257,7 +1257,7 @@ static void vmsvga_init(DeviceState *dev, struct vmsvga_state_s *s,
s->vga.con = qemu_graphic_console_create(dev, 0, &vmsvga_ops, s);
s->fifo_size = SVGA_FIFO_SIZE;
- memory_region_init_ram(&s->fifo_ram, NULL, "vmsvga.fifo", s->fifo_size,
+ memory_region_init_ram(&s->fifo_ram, OBJECT(dev), "vmsvga.fifo", s->fifo_size,
&error_fatal);
s->fifo_ptr = memory_region_get_ram_ptr(&s->fifo_ram);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 102/134] hw/arm/omap: Give lcdc and dma memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (100 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 101/134] hw/display: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 103/134] hw/char: Give parallel and htif " Alexander Graf
` (32 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Thread Object *owner as the first argument through omap_lcdc_init()
and omap_dma_init(), matching the earlier conversion of omap1.c
sub-block helpers. omap310_mpu_init() passes its parent through.
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/omap1.c | 4 ++--
hw/display/omap_lcdc.c | 5 +++--
hw/dma/omap_dma.c | 4 ++--
include/hw/arm/omap.h | 5 +++--
4 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index be6af35e26..474a3902fe 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -3800,7 +3800,7 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
dma_irqs[i] = qdev_get_gpio_in(s->ih[omap1_dma_irq_map[i].ih],
omap1_dma_irq_map[i].intr);
}
- s->dma = omap_dma_init(0xfffed800, dma_irqs, system_memory,
+ s->dma = omap_dma_init(parent, 0xfffed800, dma_irqs, system_memory,
qdev_get_gpio_in(s->ih[0], OMAP_INT_DMA_LCD),
s, omap_findclk(s, "dma_ck"));
@@ -3835,7 +3835,7 @@ struct omap_mpu_state_s *omap310_mpu_init(Object *parent, MemoryRegion *dram,
qdev_get_gpio_in(s->ih[1], OMAP_INT_OS_TIMER),
omap_findclk(s, "clk32-kHz"));
- s->lcd = omap_lcdc_init(system_memory, 0xfffec000,
+ s->lcd = omap_lcdc_init(parent, system_memory, 0xfffec000,
qdev_get_gpio_in(s->ih[0], OMAP_INT_LCD_CTRL),
omap_dma_get_lcdch(s->dma),
omap_findclk(s, "lcd_ck"));
diff --git a/hw/display/omap_lcdc.c b/hw/display/omap_lcdc.c
index b88ea5f2f1..3f6066e3a8 100644
--- a/hw/display/omap_lcdc.c
+++ b/hw/display/omap_lcdc.c
@@ -489,7 +489,8 @@ static const GraphicHwOps omap_ops = {
.gfx_update = omap_update_display,
};
-struct omap_lcd_panel_s *omap_lcdc_init(MemoryRegion *sysmem,
+struct omap_lcd_panel_s *omap_lcdc_init(Object *owner,
+ MemoryRegion *sysmem,
hwaddr base,
qemu_irq irq,
struct omap_dma_lcd_channel_s *dma,
@@ -502,7 +503,7 @@ struct omap_lcd_panel_s *omap_lcdc_init(MemoryRegion *sysmem,
s->sysmem = sysmem;
omap_lcdc_reset(s);
- memory_region_init_io(&s->iomem, NULL, &omap_lcdc_ops, s, "omap.lcdc", 0x100);
+ memory_region_init_io(&s->iomem, owner, &omap_lcdc_ops, s, "omap.lcdc", 0x100);
memory_region_add_subregion(sysmem, base, &s->iomem);
s->con = qemu_graphic_console_create(NULL, 0, &omap_ops, s);
diff --git a/hw/dma/omap_dma.c b/hw/dma/omap_dma.c
index 77f1441498..b130ba2480 100644
--- a/hw/dma/omap_dma.c
+++ b/hw/dma/omap_dma.c
@@ -1089,7 +1089,7 @@ static void omap_dma_clk_update(void *opaque, int line, int on)
soc_dma_set_request(s->ch[i].dma, on);
}
-struct soc_dma_s *omap_dma_init(hwaddr base, qemu_irq *irqs,
+struct soc_dma_s *omap_dma_init(Object *owner, hwaddr base, qemu_irq *irqs,
MemoryRegion *sysmem,
qemu_irq lcd_irq,
struct omap_mpu_state_s *mpu, omap_clk clk)
@@ -1127,7 +1127,7 @@ struct soc_dma_s *omap_dma_init(hwaddr base, qemu_irq *irqs,
omap_dma_reset(s->dma);
omap_dma_clk_update(s, 0, 1);
- memory_region_init_io(&s->iomem, NULL, &omap_dma_ops, s, "omap.dma", memsize);
+ memory_region_init_io(&s->iomem, owner, &omap_dma_ops, s, "omap.dma", memsize);
memory_region_add_subregion(sysmem, base, &s->iomem);
mpu->drq = s->dma->drq;
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
index e000dffe13..591abf752b 100644
--- a/include/hw/arm/omap.h
+++ b/include/hw/arm/omap.h
@@ -173,7 +173,7 @@ void omap_gpio_set_clk(Omap1GpioState *gpio, omap_clk clk);
/* omap_dma.c */
struct soc_dma_s;
-struct soc_dma_s *omap_dma_init(hwaddr base, qemu_irq *irqs,
+struct soc_dma_s *omap_dma_init(Object *owner, hwaddr base, qemu_irq *irqs,
MemoryRegion *sysmem,
qemu_irq lcd_irq,
struct omap_mpu_state_s *mpu, omap_clk clk);
@@ -296,7 +296,8 @@ void omap_mcbsp_i2s_attach(struct omap_mcbsp_s *s, I2SCodec *slave);
/* omap_lcdc.c */
struct omap_lcd_panel_s;
void omap_lcdc_reset(struct omap_lcd_panel_s *s);
-struct omap_lcd_panel_s *omap_lcdc_init(MemoryRegion *sysmem,
+struct omap_lcd_panel_s *omap_lcdc_init(Object *owner,
+ MemoryRegion *sysmem,
hwaddr base,
qemu_irq irq,
struct omap_dma_lcd_channel_s *dma,
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 103/134] hw/char: Give parallel and htif memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (101 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 102/134] hw/arm/omap: Give lcdc and dma " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 104/134] hw/remote: Give " Alexander Graf
` (31 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Thread Object *owner as the first argument through parallel_mm_init()
and htif_mm_init(). All callers are inside board init functions
and pass OBJECT(machine).
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/char/parallel.c | 5 +++--
hw/char/riscv_htif.c | 5 +++--
hw/hppa/machine.c | 5 +++--
hw/mips/jazz.c | 2 +-
hw/riscv/spike.c | 2 +-
include/hw/char/parallel.h | 3 ++-
include/hw/char/riscv_htif.h | 3 ++-
7 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/hw/char/parallel.c b/hw/char/parallel.c
index 07bbc9443f..39a1d77e9f 100644
--- a/hw/char/parallel.c
+++ b/hw/char/parallel.c
@@ -585,7 +585,8 @@ static const MemoryRegionOps parallel_mm_ops = {
};
/* If fd is zero, it means that the parallel device uses the console */
-bool parallel_mm_init(MemoryRegion *address_space,
+bool parallel_mm_init(Object *owner,
+ MemoryRegion *address_space,
hwaddr base, int it_shift, qemu_irq irq,
Chardev *chr)
{
@@ -597,7 +598,7 @@ bool parallel_mm_init(MemoryRegion *address_space,
s->it_shift = it_shift;
qemu_register_reset(parallel_reset, s);
- memory_region_init_io(&s->iomem, NULL, ¶llel_mm_ops, s,
+ memory_region_init_io(&s->iomem, owner, ¶llel_mm_ops, s,
"parallel", 8 << it_shift);
memory_region_add_subregion(address_space, base, &s->iomem);
return true;
diff --git a/hw/char/riscv_htif.c b/hw/char/riscv_htif.c
index 488f938d98..f9e39c31aa 100644
--- a/hw/char/riscv_htif.c
+++ b/hw/char/riscv_htif.c
@@ -329,7 +329,8 @@ static const MemoryRegionOps htif_mm_ops = {
},
};
-HTIFState *htif_mm_init(MemoryRegion *address_space, Chardev *chr,
+HTIFState *htif_mm_init(Object *owner,
+ MemoryRegion *address_space, Chardev *chr,
uint64_t nonelf_base, bool custom_base)
{
uint64_t base, size, tohost_offset, fromhost_offset;
@@ -359,7 +360,7 @@ HTIFState *htif_mm_init(MemoryRegion *address_space, Chardev *chr,
qemu_chr_fe_set_handlers(&s->chr, htif_can_recv, htif_recv, htif_event,
htif_be_change, s, NULL, true);
- memory_region_init_io(&s->mmio, NULL, &htif_mm_ops, s,
+ memory_region_init_io(&s->mmio, owner, &htif_mm_ops, s,
TYPE_HTIF_UART, size);
memory_region_add_subregion_overlap(address_space, base,
&s->mmio, 1);
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 233cf6318b..ea02b9e70e 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -613,7 +613,8 @@ static void machine_HP_715_init(MachineState *machine)
serial_hd(0), DEVICE_BIG_ENDIAN);
/* Parallel port */
- parallel_mm_init(addr_space, translate(NULL, LASI_HPA_715 + LASI_LPT + 0x800), 0,
+ parallel_mm_init(OBJECT(machine), addr_space,
+ translate(NULL, LASI_HPA_715 + LASI_LPT + 0x800), 0,
qdev_get_gpio_in(lasi_dev, LASI_IRQ_LPT_HPA),
parallel_hds[0]);
@@ -706,7 +707,7 @@ static void machine_HP_B160L_init(MachineState *machine)
serial_hd(1), DEVICE_BIG_ENDIAN);
/* Parallel port */
- parallel_mm_init(addr_space,
+ parallel_mm_init(OBJECT(machine), addr_space,
translate(NULL, LASI_HPA + LASI_LPT + 0x800), 0,
qdev_get_gpio_in(lasi_dev, LASI_IRQ_LPT_HPA),
parallel_hds[0]);
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index 8999efb352..ff18b28c86 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -385,7 +385,7 @@ static void mips_jazz_init(MachineState *machine,
/* Parallel port */
if (parallel_hds[0])
- parallel_mm_init(address_space, 0x80008000, 0,
+ parallel_mm_init(OBJECT(machine), address_space, 0x80008000, 0,
qdev_get_gpio_in(rc4030, 0), parallel_hds[0]);
/* FIXME: missing Jazz sound at 0x8000c000, rc4030[2] */
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
index 9f1a1b5898..cd9a2ee0df 100644
--- a/hw/riscv/spike.c
+++ b/hw/riscv/spike.c
@@ -247,7 +247,7 @@ static void spike_board_init(MachineState *machine)
fdt_load_addr);
/* initialize HTIF using symbols found in load_kernel */
- htif_mm_init(system_memory, serial_hd(0), memmap[SPIKE_HTIF].base,
+ htif_mm_init(OBJECT(machine), system_memory, serial_hd(0), memmap[SPIKE_HTIF].base,
htif_custom_base);
}
diff --git a/include/hw/char/parallel.h b/include/hw/char/parallel.h
index 782cc12602..7e8b9c9012 100644
--- a/include/hw/char/parallel.h
+++ b/include/hw/char/parallel.h
@@ -25,7 +25,8 @@ typedef struct ParallelState {
void parallel_hds_isa_init(Object *parent, ISABus *bus, int n);
-bool parallel_mm_init(MemoryRegion *address_space,
+bool parallel_mm_init(Object *owner,
+ MemoryRegion *address_space,
hwaddr base, int it_shift, qemu_irq irq,
Chardev *chr);
diff --git a/include/hw/char/riscv_htif.h b/include/hw/char/riscv_htif.h
index 9d61e60d0a..40516adc08 100644
--- a/include/hw/char/riscv_htif.h
+++ b/include/hw/char/riscv_htif.h
@@ -48,7 +48,8 @@ void htif_symbol_callback(const char *st_name, int st_info, uint64_t st_value,
uint64_t st_size);
/* legacy pre qom */
-HTIFState *htif_mm_init(MemoryRegion *address_space, Chardev *chr,
+HTIFState *htif_mm_init(Object *owner,
+ MemoryRegion *address_space, Chardev *chr,
uint64_t nonelf_base, bool custom_base);
#endif
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 104/134] hw/remote: Give memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (102 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 103/134] hw/char: Give parallel and htif " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 105/134] system, backends: Give named " Alexander Graf
` (30 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
remote_machine_init() passes OBJECT(machine). remote_sysmem_reconfig()
runs in the multi-process remote and creates system-memory subregions
on behalf of the machine; use qdev_get_machine() as owner.
dma_register() in the vfio-user server creates DMA windows for a
VfuObject; use it as owner.
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/remote/machine.c | 2 +-
hw/remote/memory.c | 3 ++-
hw/remote/vfio-user-obj.c | 2 +-
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/hw/remote/machine.c b/hw/remote/machine.c
index e8e9cf259f..09154fa122 100644
--- a/hw/remote/machine.c
+++ b/hw/remote/machine.c
@@ -37,7 +37,7 @@ static void remote_machine_init(MachineState *machine)
system_io = get_system_io();
pci_memory = g_new(MemoryRegion, 1);
- memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
+ memory_region_init(pci_memory, OBJECT(machine), "pci", UINT64_MAX);
rem_host = REMOTE_PCIHOST(qdev_new(OBJECT(s), "remote-pcihost",
TYPE_REMOTE_PCIHOST));
diff --git a/hw/remote/memory.c b/hw/remote/memory.c
index 8195aa5fb8..3f8fe54bac 100644
--- a/hw/remote/memory.c
+++ b/hw/remote/memory.c
@@ -12,6 +12,7 @@
#include "hw/remote/memory.h"
#include "qapi/error.h"
+#include "hw/core/qdev.h"
static void remote_sysmem_reset(void)
{
@@ -42,7 +43,7 @@ void remote_sysmem_reconfig(MPQemuMsg *msg, Error **errp)
for (region = 0; region < msg->num_fds; region++, suffix++) {
g_autofree char *name = g_strdup_printf("remote-mem-%u", suffix);
subregion = g_new(MemoryRegion, 1);
- memory_region_init_ram_from_fd(subregion, NULL,
+ memory_region_init_ram_from_fd(subregion, qdev_get_machine(),
name, sysmem_info->sizes[region],
RAM_SHARED, msg->fds[region],
sysmem_info->offsets[region],
diff --git a/hw/remote/vfio-user-obj.c b/hw/remote/vfio-user-obj.c
index 87fa7b6572..685d4c2baf 100644
--- a/hw/remote/vfio-user-obj.c
+++ b/hw/remote/vfio-user-obj.c
@@ -324,7 +324,7 @@ static void dma_register(vfu_ctx_t *vfu_ctx, vfu_dma_info_t *info)
subregion = g_new0(MemoryRegion, 1);
- memory_region_init_ram_ptr(subregion, NULL, name,
+ memory_region_init_ram_ptr(subregion, OBJECT(o), name,
iov->iov_len, info->vaddr);
dma_as = pci_device_iommu_address_space(o->pci_dev);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 105/134] system, backends: Give named memory regions an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (103 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 104/134] hw/remote: Give " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 106/134] hw/ide: Let ide_init_ioport() take " Alexander Graf
` (29 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
memory_map_init() creates the "system" and "io" root memory regions
after qemu_create_machine() has instantiated current_machine, so
qdev_get_machine() is available as owner.
The IGVM backend creates guest-memory regions on behalf of the
confidential-guest machine it carries in ctx->machine_state; use
that as owner.
subpage_init() and io_mem_init() pass name==NULL and thus never
QOM-parent their MemoryRegion; leave owner NULL there.
No functional change intended.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
backends/igvm.c | 6 ++++--
system/physmem.c | 4 ++--
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/backends/igvm.c b/backends/igvm.c
index 80e87fe602..544a51b70e 100644
--- a/backends/igvm.c
+++ b/backends/igvm.c
@@ -256,13 +256,15 @@ static void *qigvm_prepare_memory(QIgvm *ctx, uint64_t addr, uint64_t size,
igvm_pages = g_new0(MemoryRegion, 1);
if (ctx->machine_state->cgs &&
ctx->machine_state->cgs->require_guest_memfd) {
- if (!memory_region_init_ram_guest_memfd(igvm_pages, NULL,
+ if (!memory_region_init_ram_guest_memfd(igvm_pages,
+ OBJECT(ctx->machine_state),
region_name, size, errp)) {
g_free(igvm_pages);
return NULL;
}
} else {
- if (!memory_region_init_ram(igvm_pages, NULL, region_name, size,
+ if (!memory_region_init_ram(igvm_pages, OBJECT(ctx->machine_state),
+ region_name, size,
errp)) {
g_free(igvm_pages);
return NULL;
diff --git a/system/physmem.c b/system/physmem.c
index c21ea92915..8466885994 100644
--- a/system/physmem.c
+++ b/system/physmem.c
@@ -3100,11 +3100,11 @@ static void memory_map_init(void)
{
system_memory = g_malloc(sizeof(*system_memory));
- memory_region_init(system_memory, NULL, "system", UINT64_MAX);
+ memory_region_init(system_memory, qdev_get_machine(), "system", UINT64_MAX);
address_space_init(&address_space_memory, system_memory, "memory");
system_io = g_malloc(sizeof(*system_io));
- memory_region_init_io(system_io, NULL, &unassigned_io_ops, NULL, "io",
+ memory_region_init_io(system_io, qdev_get_machine(), &unassigned_io_ops, NULL, "io",
65536);
address_space_init(&address_space_io, system_io, "I/O");
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 106/134] hw/ide: Let ide_init_ioport() take an explicit owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (104 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 105/134] system, backends: Give named " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 107/134] memory: Require an owner for named memory regions Alexander Graf
` (28 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
hw/ide/piix.c calls ide_init_ioport() with a NULL ISADevice because
the PIIX IDE function is a PCI device, not an ISA one. That NULL
propagates to isa_register_portio_list() and from there to
portio_list_init() as owner==NULL, which the following commit turns
into a hard error.
Change ide_init_ioport() to take an Object *owner directly. When the
owner is an ISADevice, keep the existing isa_register_portio_list()
path so isa_init_ioport() still records the base I/O port for firmware
paths. When it is not (the PIIX case), register the port lists with
the given owner directly.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/ide/ide-internal.h | 2 +-
hw/ide/ioport.c | 37 ++++++++++++++++++++++++++-----------
hw/ide/isa.c | 2 +-
hw/ide/piix.c | 2 +-
4 files changed, 29 insertions(+), 14 deletions(-)
diff --git a/hw/ide/ide-internal.h b/hw/ide/ide-internal.h
index 281d07c9d5..3f48335cdf 100644
--- a/hw/ide/ide-internal.h
+++ b/hw/ide/ide-internal.h
@@ -419,7 +419,7 @@ uint32_t ide_data_readl(void *opaque, uint32_t addr);
int ide_init_drive(IDEState *s, IDEDevice *dev, IDEDriveKind kind, Error **errp);
void ide_exit(IDEState *s);
void ide_bus_init_output_irq(IDEBus *bus, qemu_irq irq_out);
-int ide_init_ioport(IDEBus *bus, ISADevice *isa, int iobase, int iobase2);
+int ide_init_ioport(IDEBus *bus, Object *owner, int iobase, int iobase2);
void ide_bus_set_irq(IDEBus *bus);
void ide_bus_register_restart_cb(IDEBus *bus);
diff --git a/hw/ide/ioport.c b/hw/ide/ioport.c
index a2f457f0bd..afafe6844c 100644
--- a/hw/ide/ioport.c
+++ b/hw/ide/ioport.c
@@ -1,5 +1,5 @@
/*
- * QEMU IDE disk and CD/DVD-ROM Emulator
+ * QEMU IDE Emulation: PIO ioport registration.
*
* Copyright (c) 2003 Fabrice Bellard
* Copyright (c) 2006 Openedhand Ltd.
@@ -28,19 +28,34 @@
#include "ide-internal.h"
#include "trace.h"
-int ide_init_ioport(IDEBus *bus, ISADevice *dev, int iobase, int iobase2)
+int ide_init_ioport(IDEBus *bus, Object *owner, int iobase, int iobase2)
{
+ ISADevice *isa = ISA_DEVICE(object_dynamic_cast(owner, TYPE_ISA_DEVICE));
int ret;
- /* ??? Assume only ISA and PCI configurations, and that the PCI-ISA
- bridge has been setup properly to always register with ISA. */
- ret = isa_register_portio_list(dev, &bus->portio_list,
- iobase, ide_portio_list, bus, "ide");
-
- if (ret == 0 && iobase2) {
- ret = isa_register_portio_list(dev, &bus->portio2_list,
- iobase2, ide_portio2_list, bus, "ide");
+ if (isa) {
+ ret = isa_register_portio_list(isa, &bus->portio_list,
+ iobase, ide_portio_list, bus, "ide");
+ if (ret == 0 && iobase2) {
+ ret = isa_register_portio_list(isa, &bus->portio2_list,
+ iobase2, ide_portio2_list, bus,
+ "ide");
+ }
+ return ret;
}
- return ret;
+ /* PIIX3/4: no ISADevice, but ISA I/O space is set up by the PCI-ISA */
+ /* bridge; register the port lists directly with the given owner. */
+ if (!isa_address_space_io(NULL)) {
+ return -ENODEV;
+ }
+ portio_list_init(&bus->portio_list, owner, ide_portio_list, bus, "ide");
+ portio_list_add(&bus->portio_list, isa_address_space_io(NULL), iobase);
+ if (iobase2) {
+ portio_list_init(&bus->portio2_list, owner,
+ ide_portio2_list, bus, "ide");
+ portio_list_add(&bus->portio2_list,
+ isa_address_space_io(NULL), iobase2);
+ }
+ return 0;
}
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index 37457be035..7949625e00 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -71,7 +71,7 @@ static void isa_ide_realizefn(DeviceState *dev, Error **errp)
ISAIDEState *s = ISA_IDE(dev);
ide_bus_init(&s->bus, sizeof(s->bus), dev, 0, 2);
- ide_init_ioport(&s->bus, isadev, s->iobase, s->iobase2);
+ ide_init_ioport(&s->bus, OBJECT(isadev), s->iobase, s->iobase2);
ide_bus_init_output_irq(&s->bus, isa_get_irq(isadev, s->irqnum));
vmstate_register_any(VMSTATE_IF(dev), &vmstate_ide_isa, s);
ide_bus_register_restart_cb(&s->bus);
diff --git a/hw/ide/piix.c b/hw/ide/piix.c
index a0f2709c69..5c5b91fa52 100644
--- a/hw/ide/piix.c
+++ b/hw/ide/piix.c
@@ -134,7 +134,7 @@ static bool pci_piix_init_bus(PCIIDEState *d, unsigned i, Error **errp)
int ret;
ide_bus_init(&d->bus[i], sizeof(d->bus[i]), DEVICE(d), i, 2);
- ret = ide_init_ioport(&d->bus[i], NULL, port_info[i].iobase,
+ ret = ide_init_ioport(&d->bus[i], OBJECT(d), port_info[i].iobase,
port_info[i].iobase2);
if (ret) {
error_setg_errno(errp, -ret, "Failed to realize %s port %u",
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 107/134] memory: Require an owner for named memory regions
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (105 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 106/134] hw/ide: Let ide_init_ioport() take " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 108/134] irq: Rename qemu_allocate_irq*() and friends to *_orphan() Alexander Graf
` (27 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Now that every named memory region in the tree passes an explicit
owner, replace the /machine/unattached fallback in
memory_region_do_init() and portio_list_add_1() with an assertion.
Anonymous (name==NULL) regions such as subpages and io_mem_unassigned
are never QOM-parented and continue to accept a NULL owner.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
system/ioport.c | 7 ++-----
system/memory.c | 7 +++----
2 files changed, 5 insertions(+), 9 deletions(-)
diff --git a/system/ioport.c b/system/ioport.c
index 0a1b80f299..0415b3cd60 100644
--- a/system/ioport.c
+++ b/system/ioport.c
@@ -248,11 +248,8 @@ static void portio_list_add_1(PortioList *piolist,
/* Reparent the MemoryRegion to the piolist owner */
object_ref(&mrpio->mr);
object_unparent(OBJECT(&mrpio->mr));
- if (!piolist->owner) {
- owner = machine_get_container("unattached");
- } else {
- owner = piolist->owner;
- }
+ g_assert(piolist->owner);
+ owner = piolist->owner;
name = g_strdup_printf("%s[*]", piolist->name);
object_property_add_child(owner, name, OBJECT(&mrpio->mr));
g_free(name);
diff --git a/system/memory.c b/system/memory.c
index e3ee0416cc..f3a77197df 100644
--- a/system/memory.c
+++ b/system/memory.c
@@ -1230,14 +1230,13 @@ static void memory_region_do_init(MemoryRegion *mr,
mr->dev = (DeviceState *) object_dynamic_cast(mr->owner, TYPE_DEVICE);
mr->ram_block = NULL;
+ /* A named MemoryRegion is a QOM child of @owner */
+ g_assert(!name || owner);
+
if (name) {
char *escaped_name = memory_region_escape_name(name);
char *name_array = g_strdup_printf("%s[*]", escaped_name);
- if (!owner) {
- owner = machine_get_container("unattached");
- }
-
object_property_add_child(owner, name_array, OBJECT(mr));
object_unref(OBJECT(mr));
g_free(name_array);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 108/134] irq: Rename qemu_allocate_irq*() and friends to *_orphan()
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (106 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 107/134] memory: Require an owner for named memory regions Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 109/134] irq: Reintroduce qemu_allocate_irq*() with a mandatory owner and name Alexander Graf
` (26 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Mechanical rename of the IRQ allocation helpers that create an
IRQState via object_new() with no QOM parent:
qemu_allocate_irq -> qemu_allocate_irq_orphan
qemu_allocate_irqs -> qemu_allocate_irqs_orphan
qemu_extend_irqs -> qemu_extend_irqs_orphan
qemu_irq_invert -> qemu_irq_invert_orphan
The next commit reintroduces the well-known names with a mandatory
(owner, name, ...) prefix, and later commits convert every caller
per subdirectory before deleting the *_orphan() variants.
Coccinelle: scripts/coccinelle/qom-parent/irq-rename.cocci
git ls-files '*.c' '*.h' | grep -v '^subprojects/' |
xargs sed -i -e 's/\bqemu_allocate_irqs\b/qemu_allocate_irqs_orphan/g' \
-e 's/\bqemu_allocate_irq\b/qemu_allocate_irq_orphan/g' \
-e 's/\bqemu_extend_irqs\b/qemu_extend_irqs_orphan/g' \
-e 's/\bqemu_irq_invert\b/qemu_irq_invert_orphan/g'
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/alpha/typhoon.c | 4 ++--
hw/arm/armsse.c | 4 ++--
hw/arm/exynos4_boards.c | 2 +-
hw/arm/mps2-tz.c | 2 +-
hw/arm/omap1.c | 14 +++++++-------
hw/arm/realview.c | 2 +-
hw/arm/stellaris.c | 10 +++++-----
hw/char/diva-gsp.c | 2 +-
hw/core/gpio.c | 2 +-
hw/core/irq.c | 14 +++++++-------
hw/display/macfb.c | 2 +-
hw/dma/omap_dma.c | 4 ++--
hw/i386/kvm/i8259.c | 2 +-
hw/i386/microvm.c | 2 +-
hw/i386/pc.c | 4 ++--
hw/i386/pc_piix.c | 2 +-
hw/i386/x86-cpu.c | 2 +-
hw/i386/xen/xen-hvm.c | 2 +-
hw/ide/ahci.c | 2 +-
hw/ide/pci.c | 2 +-
hw/intc/sh_intc.c | 2 +-
hw/isa/i82378.c | 2 +-
hw/isa/lpc_ich9.c | 2 +-
hw/m68k/mcf5206.c | 2 +-
hw/m68k/q800.c | 4 ++--
hw/mips/mips_int.c | 2 +-
hw/net/can/can_kvaser_pci.c | 2 +-
hw/pci-host/pnv_phb3.c | 2 +-
hw/pci-host/pnv_phb3_msi.c | 2 +-
hw/pci-host/pnv_phb4.c | 2 +-
hw/pci/pci.c | 2 +-
hw/ppc/e500.c | 2 +-
hw/ppc/pnv_lpc.c | 2 +-
hw/ppc/pnv_psi.c | 4 ++--
hw/ppc/spapr_irq.c | 2 +-
hw/riscv/sifive_u.c | 2 +-
hw/scsi/esp-pci.c | 2 +-
hw/sh4/sh7750.c | 2 +-
hw/sparc/sun4m.c | 4 ++--
hw/sparc64/sun4u.c | 2 +-
hw/timer/arm_timer.c | 4 ++--
hw/usb/vt82c686-uhci-pci.c | 2 +-
hw/xen/xen-pvh-common.c | 4 ++--
hw/xtensa/mx_pic.c | 2 +-
hw/xtensa/pic_cpu.c | 4 ++--
include/hw/core/irq.h | 8 ++++----
scripts/coccinelle/qom-parent/irq-rename.cocci | 14 ++++++++++++++
system/qtest.c | 2 +-
48 files changed, 90 insertions(+), 76 deletions(-)
create mode 100644 scripts/coccinelle/qom-parent/irq-rename.cocci
diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
index af39f2659b..671e8f89d9 100644
--- a/hw/alpha/typhoon.c
+++ b/hw/alpha/typhoon.c
@@ -849,8 +849,8 @@ PCIBus *typhoon_init(Object *parent, MemoryRegion *ram, qemu_irq *p_isa_irq,
}
}
- *p_isa_irq = qemu_allocate_irq(typhoon_set_isa_irq, s, 0);
- *p_rtc_irq = qemu_allocate_irq(typhoon_set_timer_irq, s, 0);
+ *p_isa_irq = qemu_allocate_irq_orphan(typhoon_set_isa_irq, s, 0);
+ *p_rtc_irq = qemu_allocate_irq_orphan(typhoon_set_timer_irq, s, 0);
/* Main memory region, 0x00.0000.0000. Real hardware supports 32GB,
but the address space hole reserved at this point is 8TB. */
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
index 81895ad370..93f6715224 100644
--- a/hw/arm/armsse.c
+++ b/hw/arm/armsse.c
@@ -693,7 +693,7 @@ static void armsse_forward_sec_resp_cfg(ARMSSE *s)
DeviceState *dev_splitter = DEVICE(&s->sec_resp_splitter);
qdev_init_gpio_out_named(dev, &s->sec_resp_cfg, "sec_resp_cfg", 1);
- s->sec_resp_cfg_in = qemu_allocate_irq(irq_status_forwarder,
+ s->sec_resp_cfg_in = qemu_allocate_irq_orphan(irq_status_forwarder,
s->sec_resp_cfg, 1);
qdev_connect_gpio_out(dev_splitter, 2, s->sec_resp_cfg_in);
}
@@ -1137,7 +1137,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
sysbus_mmio_map(sbd_secctl, 0, 0x50080000);
sysbus_mmio_map(sbd_secctl, 1, 0x40080000);
- s->nsc_cfg_in = qemu_allocate_irq(nsccfg_handler, s, 1);
+ s->nsc_cfg_in = qemu_allocate_irq_orphan(nsccfg_handler, s, 1);
qdev_connect_gpio_out_named(dev_secctl, "nsc_cfg", 0, s->nsc_cfg_in);
/* The sec_resp_cfg output from the security controller must be split into
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index 8430317815..537a50f8cc 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -146,7 +146,7 @@ static void smdkc210_init(MachineState *machine)
EXYNOS4_BOARD_SMDKC210);
lan9215_init(SMDK_LAN9118_BASE_ADDR,
- qemu_irq_invert(s->soc.irq_table[exynos4210_get_irq(37, 1)]));
+ qemu_irq_invert_orphan(s->soc.irq_table[exynos4210_get_irq(37, 1)]));
arm_load_kernel(s->soc.cpu[0], machine, &exynos4_board_binfo);
}
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
index a57915e208..654eaedd97 100644
--- a/hw/arm/mps2-tz.c
+++ b/hw/arm/mps2-tz.c
@@ -1209,7 +1209,7 @@ static void mps2tz_common_init(MachineState *machine)
* Connect the line from the SCC so that we can remap when the
* guest updates that register.
*/
- mms->remap_irq = qemu_allocate_irq(remap_irq_fn, mms, 0);
+ mms->remap_irq = qemu_allocate_irq_orphan(remap_irq_fn, mms, 0);
qdev_connect_gpio_out_named(DEVICE(&mms->scc), "remap", 0,
mms->remap_irq);
}
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index 474a3902fe..53e52ef34e 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -139,7 +139,7 @@ static void omap_timer_clk_update(void *opaque, int line, int on)
static void omap_timer_clk_setup(struct omap_mpu_timer_s *timer)
{
omap_clk_adduser(timer->clk,
- qemu_allocate_irq(omap_timer_clk_update, timer, 0));
+ qemu_allocate_irq_orphan(omap_timer_clk_update, timer, 0));
timer->rate = omap_clk_getrate(timer->clk);
}
@@ -2083,14 +2083,14 @@ static struct omap_mpuio_s *omap_mpuio_init(Object *owner,
s->irq = gpio_int;
s->kbd_irq = kbd_int;
- s->in = qemu_allocate_irqs(omap_mpuio_set, s, 16);
+ s->in = qemu_allocate_irqs_orphan(omap_mpuio_set, s, 16);
omap_mpuio_reset(s);
memory_region_init_io(&s->iomem, owner, &omap_mpuio_ops, s,
"omap-mpuio", 0x800);
memory_region_add_subregion(memory, base, &s->iomem);
- omap_clk_adduser(clk, qemu_allocate_irq(omap_mpuio_onoff, s, 0));
+ omap_clk_adduser(clk, qemu_allocate_irq_orphan(omap_mpuio_onoff, s, 0));
return s;
}
@@ -2363,7 +2363,7 @@ static struct omap_pwl_s *omap_pwl_init(Object *owner,
"omap-pwl", 0x800);
memory_region_add_subregion(system_memory, base, &s->iomem);
- omap_clk_adduser(clk, qemu_allocate_irq(omap_pwl_clk_update, s, 0));
+ omap_clk_adduser(clk, qemu_allocate_irq_orphan(omap_pwl_clk_update, s, 0));
return s;
}
@@ -3426,8 +3426,8 @@ static void omap_mcbsp_i2s_start(void *opaque, int line, int level)
void omap_mcbsp_i2s_attach(struct omap_mcbsp_s *s, I2SCodec *slave)
{
s->codec = slave;
- slave->rx_swallow = qemu_allocate_irq(omap_mcbsp_i2s_swallow, s, 0);
- slave->tx_start = qemu_allocate_irq(omap_mcbsp_i2s_start, s, 0);
+ slave->rx_swallow = qemu_allocate_irq_orphan(omap_mcbsp_i2s_swallow, s, 0);
+ slave->tx_start = qemu_allocate_irq_orphan(omap_mcbsp_i2s_start, s, 0);
}
/* LED Pulse Generators */
@@ -3579,7 +3579,7 @@ static struct omap_lpg_s *omap_lpg_init(Object *owner,
"omap-lpg", 0x800);
memory_region_add_subregion(system_memory, base, &s->iomem);
- omap_clk_adduser(clk, qemu_allocate_irq(omap_lpg_clk_update, s, 0));
+ omap_clk_adduser(clk, qemu_allocate_irq_orphan(omap_lpg_clk_update, s, 0));
return s;
}
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index 73bfffa6e6..cd63f39f42 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -276,7 +276,7 @@ static void realview_init(MachineState *machine,
split_irq_from_named(OBJECT(machine), dev, "card-inserted",
qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_CARDIN),
- qemu_irq_invert(qdev_get_gpio_in(gpio2, 0)));
+ qemu_irq_invert_orphan(qdev_get_gpio_in(gpio2, 0)));
dinfo = drive_get(IF_SD, 0, 0);
if (dinfo) {
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index 1bc428e063..a5d037094a 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1358,15 +1358,15 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
sysbus_realize(SYS_BUS_DEVICE(gpad), &error_fatal);
qdev_connect_gpio_out(gpad, 0,
- qemu_irq_invert(gpio_in[GPIO_E][0])); /* up */
+ qemu_irq_invert_orphan(gpio_in[GPIO_E][0])); /* up */
qdev_connect_gpio_out(gpad, 1,
- qemu_irq_invert(gpio_in[GPIO_E][1])); /* down */
+ qemu_irq_invert_orphan(gpio_in[GPIO_E][1])); /* down */
qdev_connect_gpio_out(gpad, 2,
- qemu_irq_invert(gpio_in[GPIO_E][2])); /* left */
+ qemu_irq_invert_orphan(gpio_in[GPIO_E][2])); /* left */
qdev_connect_gpio_out(gpad, 3,
- qemu_irq_invert(gpio_in[GPIO_E][3])); /* right */
+ qemu_irq_invert_orphan(gpio_in[GPIO_E][3])); /* right */
qdev_connect_gpio_out(gpad, 4,
- qemu_irq_invert(gpio_in[GPIO_F][1])); /* select */
+ qemu_irq_invert_orphan(gpio_in[GPIO_F][1])); /* select */
}
for (i = 0; i < 7; i++) {
if (board->dc4 & (1 << i)) {
diff --git a/hw/char/diva-gsp.c b/hw/char/diva-gsp.c
index 53fd0fe2a1..bf1da1faee 100644
--- a/hw/char/diva-gsp.c
+++ b/hw/char/diva-gsp.c
@@ -126,7 +126,7 @@ static void diva_pci_realize(PCIDevice *dev, Error **errp)
pci->dev.config[PCI_INTERRUPT_PIN] = 1;
memory_region_init(&pci->membar, OBJECT(pci), "serial_ports", 4096);
pci_register_bar(&pci->dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &pci->membar);
- pci->irqs = qemu_allocate_irqs(multi_serial_irq_mux, pci, di.nports);
+ pci->irqs = qemu_allocate_irqs_orphan(multi_serial_irq_mux, pci, di.nports);
for (i = 0; i < di.nports; i++) {
s = pci->state + i;
diff --git a/hw/core/gpio.c b/hw/core/gpio.c
index 37cda5ce4d..ef8ef8f25a 100644
--- a/hw/core/gpio.c
+++ b/hw/core/gpio.c
@@ -49,7 +49,7 @@ void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
assert(gpio_list->num_out == 0 || !name);
- gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
+ gpio_list->in = qemu_extend_irqs_orphan(gpio_list->in, gpio_list->num_in, handler,
opaque, n);
if (!name) {
diff --git a/hw/core/irq.c b/hw/core/irq.c
index 1b610e75e1..f8fdeb7e02 100644
--- a/hw/core/irq.c
+++ b/hw/core/irq.c
@@ -68,7 +68,7 @@ void qemu_init_irqs(IRQState irq[], size_t count,
}
}
-qemu_irq *qemu_extend_irqs(qemu_irq *old, int n_old, qemu_irq_handler handler,
+qemu_irq *qemu_extend_irqs_orphan(qemu_irq *old, int n_old, qemu_irq_handler handler,
void *opaque, int n)
{
qemu_irq *s;
@@ -79,17 +79,17 @@ qemu_irq *qemu_extend_irqs(qemu_irq *old, int n_old, qemu_irq_handler handler,
}
s = old ? g_renew(qemu_irq, old, n + n_old) : g_new(qemu_irq, n);
for (i = n_old; i < n + n_old; i++) {
- s[i] = qemu_allocate_irq(handler, opaque, i);
+ s[i] = qemu_allocate_irq_orphan(handler, opaque, i);
}
return s;
}
-qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n)
+qemu_irq *qemu_allocate_irqs_orphan(qemu_irq_handler handler, void *opaque, int n)
{
- return qemu_extend_irqs(NULL, 0, handler, opaque, n);
+ return qemu_extend_irqs_orphan(NULL, 0, handler, opaque, n);
}
-qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n)
+qemu_irq qemu_allocate_irq_orphan(qemu_irq_handler handler, void *opaque, int n)
{
IRQState *irq = IRQ(object_new(TYPE_IRQ));
init_irq_fields(irq, handler, opaque, n);
@@ -117,11 +117,11 @@ static void qemu_notirq(void *opaque, int line, int level)
qemu_set_irq(irq, !level);
}
-qemu_irq qemu_irq_invert(qemu_irq irq)
+qemu_irq qemu_irq_invert_orphan(qemu_irq irq)
{
/* The default state for IRQs is low, so raise the output now. */
qemu_irq_raise(irq);
- return qemu_allocate_irq(qemu_notirq, irq, 0);
+ return qemu_allocate_irq_orphan(qemu_notirq, irq, 0);
}
void qemu_irq_set_observer(qemu_irq *gpio_in, qemu_irq_handler handler, int n)
diff --git a/hw/display/macfb.c b/hw/display/macfb.c
index f40a7ed9f5..de5c83884e 100644
--- a/hw/display/macfb.c
+++ b/hw/display/macfb.c
@@ -737,7 +737,7 @@ static void macfb_nubus_realize(DeviceState *dev, Error **errp)
memory_region_add_subregion(&nd->slot_mem, DAFB_BASE, &ms->mem_ctrl);
memory_region_add_subregion(&nd->slot_mem, VIDEO_BASE, &ms->mem_vram);
- ms->irq = qemu_allocate_irq(macfb_nubus_set_irq, s, 0);
+ ms->irq = qemu_allocate_irq_orphan(macfb_nubus_set_irq, s, 0);
}
static void macfb_nubus_unrealize(DeviceState *dev)
diff --git a/hw/dma/omap_dma.c b/hw/dma/omap_dma.c
index b130ba2480..7a2a3310f9 100644
--- a/hw/dma/omap_dma.c
+++ b/hw/dma/omap_dma.c
@@ -1109,7 +1109,7 @@ struct soc_dma_s *omap_dma_init(Object *owner, hwaddr base, qemu_irq *irqs,
s->dma->freq = omap_clk_getrate(clk);
s->dma->transfer_fn = omap_dma_transfer_generic;
s->dma->setup_fn = omap_dma_transfer_setup;
- s->dma->drq = qemu_allocate_irqs(omap_dma_request, s, 32);
+ s->dma->drq = qemu_allocate_irqs_orphan(omap_dma_request, s, 32);
s->dma->opaque = s;
while (num_irqs --)
@@ -1123,7 +1123,7 @@ struct soc_dma_s *omap_dma_init(Object *owner, hwaddr base, qemu_irq *irqs,
s->dma->ch[i].opaque = &s->ch[i];
}
- omap_clk_adduser(s->clk, qemu_allocate_irq(omap_dma_clk_update, s, 0));
+ omap_clk_adduser(s->clk, qemu_allocate_irq_orphan(omap_dma_clk_update, s, 0));
omap_dma_reset(s->dma);
omap_dma_clk_update(s, 0, 1);
diff --git a/hw/i386/kvm/i8259.c b/hw/i386/kvm/i8259.c
index 5fb11d3613..7ef7a0b487 100644
--- a/hw/i386/kvm/i8259.c
+++ b/hw/i386/kvm/i8259.c
@@ -136,7 +136,7 @@ qemu_irq *kvm_i8259_init(Object *parent, ISABus *bus)
i8259_init_chip(parent, TYPE_KVM_I8259, bus, true);
i8259_init_chip(parent, TYPE_KVM_I8259, bus, false);
- return qemu_allocate_irqs(kvm_pic_set_irq, NULL, ISA_NUM_IRQS);
+ return qemu_allocate_irqs_orphan(kvm_pic_set_irq, NULL, ISA_NUM_IRQS);
}
static void kvm_i8259_class_init(ObjectClass *klass, const void *data)
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 751e3962fa..07dbe3a18b 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -168,7 +168,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
/* Core components */
ioapics = microvm_ioapics(mms);
gsi_state = g_malloc0(sizeof(*gsi_state));
- x86ms->gsi = qemu_allocate_irqs(gsi_handler, gsi_state,
+ x86ms->gsi = qemu_allocate_irqs_orphan(gsi_handler, gsi_state,
IOAPIC_NUM_PINS * ioapics);
isa_bus = isa_bus_new_bridge(OBJECT(mms), get_system_memory(), get_system_io(),
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 8057058ff0..249fa699c7 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -200,7 +200,7 @@ GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
if (kvm_ioapic_in_kernel()) {
kvm_pc_setup_irq_routing(pci_enabled);
}
- *irqs = qemu_allocate_irqs(gsi_handler, s, IOAPIC_NUM_PINS);
+ *irqs = qemu_allocate_irqs_orphan(gsi_handler, s, IOAPIC_NUM_PINS);
return s;
}
@@ -1028,7 +1028,7 @@ static void pc_superio_init(Object *parent, ISABus *isa_bus, bool create_fdctrl,
}
port92 = isa_create_simple(parent, "port92", isa_bus, TYPE_PORT92);
- a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2);
+ a20_line = qemu_allocate_irqs_orphan(handle_a20_line_change, first_cpu, 2);
qdev_connect_gpio_out_named(DEVICE(i8042),
I8042_A20_LINE, 0, a20_line[0]);
qdev_connect_gpio_out_named(DEVICE(port92),
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 0b8d7d88b9..f76d684d6b 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -299,7 +299,7 @@ static void pc_init1(MachineState *machine, const char *pci_type)
pc_nic_init(pcmc, isa_bus, pcms->pcibus);
if (piix4_pm) {
- smi_irq = qemu_allocate_irq(pc_acpi_smi_interrupt, first_cpu, 0);
+ smi_irq = qemu_allocate_irq_orphan(pc_acpi_smi_interrupt, first_cpu, 0);
qdev_connect_gpio_out_named(DEVICE(piix4_pm), "smi-irq", 0, smi_irq);
pcms->smbus = I2C_BUS(qdev_get_child_bus(DEVICE(piix4_pm), "i2c"));
diff --git a/hw/i386/x86-cpu.c b/hw/i386/x86-cpu.c
index 95e08e3c2a..6d010291cf 100644
--- a/hw/i386/x86-cpu.c
+++ b/hw/i386/x86-cpu.c
@@ -63,7 +63,7 @@ static void pic_irq_request(void *opaque, int irq, int level)
qemu_irq x86_allocate_cpu_irq(void)
{
- return qemu_allocate_irq(pic_irq_request, NULL, 0);
+ return qemu_allocate_irq_orphan(pic_irq_request, NULL, 0);
}
int cpu_get_pic_interrupt(CPUX86State *env)
diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c
index 01d851ce3e..e87c8237ea 100644
--- a/hw/i386/xen/xen-hvm.c
+++ b/hw/i386/xen/xen-hvm.c
@@ -114,7 +114,7 @@ static void xen_set_irq(void *opaque, int irq, int level)
qemu_irq *xen_interrupt_controller_init(void)
{
- return qemu_allocate_irqs(xen_set_irq, NULL, 16);
+ return qemu_allocate_irqs_orphan(xen_set_irq, NULL, 16);
}
/* Memory Ops */
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 749f0efa1d..ac1cf26bab 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -1594,7 +1594,7 @@ void ahci_realize(AHCIState *s, DeviceState *qdev, AddressSpace *as)
assert(s->ports > 0);
s->dev = g_new0(AHCIDevice, s->ports);
ahci_reg_init(s);
- irqs = qemu_allocate_irqs(ahci_irq_set, s, s->ports);
+ irqs = qemu_allocate_irqs_orphan(ahci_irq_set, s, s->ports);
for (i = 0; i < s->ports; i++) {
AHCIDevice *ad = &s->dev[i];
diff --git a/hw/ide/pci.c b/hw/ide/pci.c
index 7ce1ae67ab..c808469008 100644
--- a/hw/ide/pci.c
+++ b/hw/ide/pci.c
@@ -606,7 +606,7 @@ void bmdma_init(IDEBus *bus, BMDMAState *bm, PCIIDEState *d)
bm->dma.ops = &bmdma_ops;
bus->dma = &bm->dma;
bm->irq = bus->irq;
- bus->irq = qemu_allocate_irq(bmdma_irq, bm, 0);
+ bus->irq = qemu_allocate_irq_orphan(bmdma_irq, bm, 0);
bm->bus = bus;
bm->pci_dev = d;
}
diff --git a/hw/intc/sh_intc.c b/hw/intc/sh_intc.c
index 37feb6a813..63f4eee2aa 100644
--- a/hw/intc/sh_intc.c
+++ b/hw/intc/sh_intc.c
@@ -403,7 +403,7 @@ int sh_intc_init(Object *owner, MemoryRegion *sysmem,
for (i = 0; i < nr_sources; i++) {
desc->sources[i].parent = desc;
}
- desc->irqs = qemu_allocate_irqs(sh_intc_set_irq, desc, nr_sources);
+ desc->irqs = qemu_allocate_irqs_orphan(sh_intc_set_irq, desc, nr_sources);
memory_region_init_io(&desc->iomem, owner, &sh_intc_ops, desc, "intc",
0x100000000ULL);
j = 0;
diff --git a/hw/isa/i82378.c b/hw/isa/i82378.c
index 995d1eaa53..4f0be992e0 100644
--- a/hw/isa/i82378.c
+++ b/hw/isa/i82378.c
@@ -95,7 +95,7 @@ static void i82378_realize(PCIDevice *pci, Error **errp)
/* 2 82C59 (irq) */
s->isa_irqs_in = i8259_init(OBJECT(pci), isabus,
- qemu_allocate_irq(i82378_request_out0_irq,
+ qemu_allocate_irq_orphan(i82378_request_out0_irq,
s, 0));
isa_bus_register_input_irqs(isabus, s->isa_irqs_in);
diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
index edf9783ec8..7cb82519fb 100644
--- a/hw/isa/lpc_ich9.c
+++ b/hw/isa/lpc_ich9.c
@@ -429,7 +429,7 @@ static void ich9_lpc_pm_init(ICH9LPCState *lpc)
qemu_irq sci_irq;
FWCfgState *fw_cfg = fw_cfg_find();
- sci_irq = qemu_allocate_irq(ich9_set_sci, lpc, 0);
+ sci_irq = qemu_allocate_irq_orphan(ich9_set_sci, lpc, 0);
ich9_pm_init(PCI_DEVICE(lpc), &lpc->pm, sci_irq);
if (lpc->smi_host_features && fw_cfg) {
diff --git a/hw/m68k/mcf5206.c b/hw/m68k/mcf5206.c
index ee39a6ac30..cbb361fae9 100644
--- a/hw/m68k/mcf5206.c
+++ b/hw/m68k/mcf5206.c
@@ -593,7 +593,7 @@ static void mcf5206_mbar_realize(DeviceState *dev, Error **errp)
"mbar", 0x00001000);
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
- s->pic = qemu_allocate_irqs(m5206_mbar_set_irq, s, 14);
+ s->pic = qemu_allocate_irqs_orphan(m5206_mbar_set_irq, s, 14);
m5206_timer_init(&s->timer[0], s->pic[9]);
m5206_timer_init(&s->timer[1], s->pic[10]);
s->uart[0] = mcf_uart_create(OBJECT(s), s->pic[12], serial_hd(0));
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 954cdf8489..177fff0289 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -474,11 +474,11 @@ static void q800_machine_init(MachineState *machine)
sysbus_realize(sysbus, &error_fatal);
/* SCSI and SCSI data IRQs are negative edge triggered */
sysbus_connect_irq(sysbus, 0,
- qemu_irq_invert(
+ qemu_irq_invert_orphan(
qdev_get_gpio_in(DEVICE(&m->via2),
VIA2_IRQ_SCSI_BIT)));
sysbus_connect_irq(sysbus, 1,
- qemu_irq_invert(
+ qemu_irq_invert_orphan(
qdev_get_gpio_in(DEVICE(&m->via2),
VIA2_IRQ_SCSI_DATA_BIT)));
memory_region_add_subregion(&m->macio, ESP_BASE - IO_BASE,
diff --git a/hw/mips/mips_int.c b/hw/mips/mips_int.c
index 26e7dd6d5f..814d07319f 100644
--- a/hw/mips/mips_int.c
+++ b/hw/mips/mips_int.c
@@ -56,7 +56,7 @@ void cpu_mips_irq_init_cpu(MIPSCPU *cpu)
qemu_irq *qi;
int i;
- qi = qemu_allocate_irqs(cpu_mips_irq_request, cpu, 8);
+ qi = qemu_allocate_irqs_orphan(cpu_mips_irq_request, cpu, 8);
for (i = 0; i < 8; i++) {
env->irq[i] = qi[i];
}
diff --git a/hw/net/can/can_kvaser_pci.c b/hw/net/can/can_kvaser_pci.c
index f2912b206d..69fc66de14 100644
--- a/hw/net/can/can_kvaser_pci.c
+++ b/hw/net/can/can_kvaser_pci.c
@@ -224,7 +224,7 @@ static void kvaser_pci_realize(PCIDevice *pci_dev, Error **errp)
pci_conf = pci_dev->config;
pci_conf[PCI_INTERRUPT_PIN] = 0x01; /* interrupt pin A */
- d->irq = qemu_allocate_irq(kvaser_pci_irq_handler, d, 0);
+ d->irq = qemu_allocate_irq_orphan(kvaser_pci_irq_handler, d, 0);
can_sja_init(s, d->irq);
diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
index 4ffdb4ce31..63da48f5af 100644
--- a/hw/pci-host/pnv_phb3.c
+++ b/hw/pci-host/pnv_phb3.c
@@ -1054,7 +1054,7 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
ics_set_irq_type(&phb->lsis, i, true);
}
- phb->qirqs = qemu_allocate_irqs(ics_set_irq, &phb->lsis, phb->lsis.nr_irqs);
+ phb->qirqs = qemu_allocate_irqs_orphan(ics_set_irq, &phb->lsis, phb->lsis.nr_irqs);
/* MSI sources */
object_property_set_link(OBJECT(&phb->msis), "phb", OBJECT(phb),
diff --git a/hw/pci-host/pnv_phb3_msi.c b/hw/pci-host/pnv_phb3_msi.c
index 66ba7b7913..fa5f61ea2b 100644
--- a/hw/pci-host/pnv_phb3_msi.c
+++ b/hw/pci-host/pnv_phb3_msi.c
@@ -267,7 +267,7 @@ static void phb3_msi_realize(DeviceState *dev, Error **errp)
return;
}
- msi->qirqs = qemu_allocate_irqs(phb3_msi_set_irq, msi, ics->nr_irqs);
+ msi->qirqs = qemu_allocate_irqs_orphan(phb3_msi_set_irq, msi, ics->nr_irqs);
}
static void phb3_msi_instance_init(Object *obj)
diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c
index 705a5bcf07..7a1988a2b2 100644
--- a/hw/pci-host/pnv_phb4.c
+++ b/hw/pci-host/pnv_phb4.c
@@ -1605,7 +1605,7 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp)
pnv_phb4_update_xsrc(phb);
- phb->qirqs = qemu_allocate_irqs(xive_source_set_irq, xsrc, xsrc->nr_irqs);
+ phb->qirqs = qemu_allocate_irqs_orphan(xive_source_set_irq, xsrc, xsrc->nr_irqs);
pnv_phb4_xscom_realize(phb);
}
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 5ef9dfa8b7..9ba7bfd977 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -1869,7 +1869,7 @@ qemu_irq pci_allocate_irq(PCIDevice *pci_dev)
int intx = pci_intx(pci_dev);
assert(0 <= intx && intx < PCI_NUM_PINS);
- return qemu_allocate_irq(pci_irq_handler, pci_dev, intx);
+ return qemu_allocate_irq_orphan(pci_irq_handler, pci_dev, intx);
}
void pci_set_irq(PCIDevice *pci_dev, int level)
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 21e656e87f..62692f5776 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -1089,7 +1089,7 @@ void ppce500_init(MachineState *machine)
sysbus_mmio_get_region(s, 0));
/* Power Off GPIO at Pin 0 */
- poweroff_irq = qemu_allocate_irq(ppce500_power_off, NULL, 0);
+ poweroff_irq = qemu_allocate_irq_orphan(ppce500_power_off, NULL, 0);
qdev_connect_gpio_out(dev, 0, poweroff_irq);
}
diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
index 6ae228088f..e89defb321 100644
--- a/hw/ppc/pnv_lpc.c
+++ b/hw/ppc/pnv_lpc.c
@@ -993,7 +993,7 @@ ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **errp)
}
/* POWER has a 17th irq, QEMU only implements the 16 regular device irqs */
- irqs = qemu_allocate_irqs(handler, lpc, ISA_NUM_IRQS);
+ irqs = qemu_allocate_irqs_orphan(handler, lpc, ISA_NUM_IRQS);
isa_bus_register_input_irqs(isa_bus, irqs);
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index e8701c6100..1ff33596ac 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -509,7 +509,7 @@ static void pnv_psi_power8_realize(DeviceState *dev, Error **errp)
qdev_init_gpio_in(dev, pnv_psi_power8_set_irq, ics->nr_irqs);
- psi->qirqs = qemu_allocate_irqs(ics_set_irq, ics, ics->nr_irqs);
+ psi->qirqs = qemu_allocate_irqs_orphan(ics_set_irq, ics, ics->nr_irqs);
/* XSCOM region for PSI registers */
pnv_xscom_region_init(&psi->xscom_regs, OBJECT(dev), &pnv_psi_xscom_ops,
@@ -872,7 +872,7 @@ static void pnv_psi_power9_realize(DeviceState *dev, Error **errp)
xive_source_irq_set_lsi(xsrc, i);
}
- psi->qirqs = qemu_allocate_irqs(xive_source_set_irq, xsrc, xsrc->nr_irqs);
+ psi->qirqs = qemu_allocate_irqs_orphan(xive_source_set_irq, xsrc, xsrc->nr_irqs);
qdev_init_gpio_in(dev, pnv_psi_power9_set_irq, xsrc->nr_irqs);
diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
index b9e5f5d710..a05edb78bc 100644
--- a/hw/ppc/spapr_irq.c
+++ b/hw/ppc/spapr_irq.c
@@ -339,7 +339,7 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
spapr_xive_hcall_init(spapr);
}
- spapr->qirqs = qemu_allocate_irqs(spapr_set_irq, spapr,
+ spapr->qirqs = qemu_allocate_irqs_orphan(spapr_set_irq, spapr,
SPAPR_NR_XIRQS + SPAPR_IRQ_NR_IPIS);
/*
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index 9d3f5c8f59..3df9fafb12 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -484,7 +484,7 @@ static void sifive_u_machine_init(MachineState *machine)
/* register gpio-restart */
qdev_connect_gpio_out(DEVICE(&(s->soc.gpio)), 10,
- qemu_allocate_irq(sifive_u_machine_reset, NULL, 0));
+ qemu_allocate_irq_orphan(sifive_u_machine_reset, NULL, 0));
/* load/create device tree */
if (machine->dtb) {
diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
index b31ccdbecc..4c02b23a28 100644
--- a/hw/scsi/esp-pci.c
+++ b/hw/scsi/esp-pci.c
@@ -407,7 +407,7 @@ static void esp_pci_scsi_realize(PCIDevice *dev, Error **errp)
"esp-io", 0x80);
pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &pci->io);
- s->irq = qemu_allocate_irq(esp_irq_handler, pci, 0);
+ s->irq = qemu_allocate_irq_orphan(esp_irq_handler, pci, 0);
scsi_bus_init(&s->bus, sizeof(s->bus), d, &esp_pci_scsi_info);
}
diff --git a/hw/sh4/sh7750.c b/hw/sh4/sh7750.c
index ea55a3a9cc..307daa523d 100644
--- a/hw/sh4/sh7750.c
+++ b/hw/sh4/sh7750.c
@@ -848,5 +848,5 @@ SH7750State *sh7750_init(Object *parent, SuperHCPU *cpu,
qemu_irq sh7750_irl(SH7750State *s)
{
sh_intc_toggle_source(&s->intc.sources[IRL], 1, 0); /* enable */
- return qemu_allocate_irq(sh_intc_set_irl, &s->intc.sources[IRL], 0);
+ return qemu_allocate_irq_orphan(sh_intc_set_irl, &s->intc.sources[IRL], 0);
}
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index a0d0213d0b..0a35b20e17 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -1008,7 +1008,7 @@ static void sun4m_hw_init(MachineState *machine)
if (hwdef->apc_base) {
apc_init(OBJECT(machine), hwdef->apc_base,
- qemu_allocate_irq(cpu_halt_signal, NULL, 0));
+ qemu_allocate_irq_orphan(cpu_halt_signal, NULL, 0));
}
if (hwdef->fd_base) {
@@ -1018,7 +1018,7 @@ static void sun4m_hw_init(MachineState *machine)
sun4m_fdctrl_init(OBJECT(machine), slavio_irq[22], hwdef->fd_base, fd,
&fdc_tc);
} else {
- fdc_tc = qemu_allocate_irq(dummy_fdc_tc, NULL, 0);
+ fdc_tc = qemu_allocate_irq_orphan(dummy_fdc_tc, NULL, 0);
}
slavio_misc_init(OBJECT(machine), hwdef->slavio_base, hwdef->aux1_base,
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index dbf49ef43d..389436fd3d 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -311,7 +311,7 @@ static void ebus_realize(PCIDevice *pci_dev, Error **errp)
}
/* ISA bus */
- s->isa_irqs_in = qemu_allocate_irqs(ebus_isa_irq_handler, s, ISA_NUM_IRQS);
+ s->isa_irqs_in = qemu_allocate_irqs_orphan(ebus_isa_irq_handler, s, ISA_NUM_IRQS);
isa_bus_register_input_irqs(s->isa_bus, s->isa_irqs_in);
qdev_init_gpio_out_named(DEVICE(s), s->isa_irqs_out, "isa-irq",
ISA_NUM_IRQS);
diff --git a/hw/timer/arm_timer.c b/hw/timer/arm_timer.c
index fb70333c53..1c29db12a2 100644
--- a/hw/timer/arm_timer.c
+++ b/hw/timer/arm_timer.c
@@ -305,8 +305,8 @@ static void sp804_realize(DeviceState *dev, Error **errp)
s->timer[0] = arm_timer_init(s->freq0);
s->timer[1] = arm_timer_init(s->freq1);
- s->timer[0]->irq = qemu_allocate_irq(sp804_set_irq, s, 0);
- s->timer[1]->irq = qemu_allocate_irq(sp804_set_irq, s, 1);
+ s->timer[0]->irq = qemu_allocate_irq_orphan(sp804_set_irq, s, 0);
+ s->timer[1]->irq = qemu_allocate_irq_orphan(sp804_set_irq, s, 1);
}
/* Integrator/CP timer module. */
diff --git a/hw/usb/vt82c686-uhci-pci.c b/hw/usb/vt82c686-uhci-pci.c
index 97c09a51cf..b58b61e609 100644
--- a/hw/usb/vt82c686-uhci-pci.c
+++ b/hw/usb/vt82c686-uhci-pci.c
@@ -23,7 +23,7 @@ static void usb_uhci_vt82c686b_realize(PCIDevice *dev, Error **errp)
usb_uhci_common_realize(dev, errp);
object_unref(s->irq);
- s->irq = qemu_allocate_irq(uhci_isa_set_irq, s, 0);
+ s->irq = qemu_allocate_irq_orphan(uhci_isa_set_irq, s, 0);
}
static UHCIInfo uhci_info[] = {
diff --git a/hw/xen/xen-pvh-common.c b/hw/xen/xen-pvh-common.c
index 1047aabd57..42514a599e 100644
--- a/hw/xen/xen-pvh-common.c
+++ b/hw/xen/xen-pvh-common.c
@@ -170,7 +170,7 @@ static void xen_create_virtio_mmio_devices(XenPVHMachineState *s)
*/
for (i = s->cfg.virtio_mmio_num - 1; i >= 0; i--) {
hwaddr base = s->cfg.virtio_mmio.base + i * s->cfg.virtio_mmio.size;
- qemu_irq irq = qemu_allocate_irq(xen_set_irq, NULL,
+ qemu_irq irq = qemu_allocate_irq_orphan(xen_set_irq, NULL,
s->cfg.virtio_mmio_irq_base + i);
sysbus_create_simple(OBJECT(s), "virtio-mmio[*]", "virtio-mmio",
@@ -260,7 +260,7 @@ static inline void xenpvh_gpex_init(XenPVHMachineState *s,
assert(xpc->set_pci_intx_irq);
for (i = 0; i < PCI_NUM_PINS; i++) {
- qemu_irq irq = qemu_allocate_irq(xpc->set_pci_intx_irq, s, i);
+ qemu_irq irq = qemu_allocate_irq_orphan(xpc->set_pci_intx_irq, s, i);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, irq);
gpex_set_irq_num(GPEX_HOST(dev), i, s->cfg.pci_intx_irq_base + i);
diff --git a/hw/xtensa/mx_pic.c b/hw/xtensa/mx_pic.c
index f349fb125c..9959bec5f2 100644
--- a/hw/xtensa/mx_pic.c
+++ b/hw/xtensa/mx_pic.c
@@ -346,7 +346,7 @@ XtensaMxPic *xtensa_mx_pic_init(unsigned n_irq)
XtensaMxPic *mx = g_new0(XtensaMxPic, 1);
mx->n_irq = n_irq + 1;
- mx->irq_inputs = qemu_allocate_irqs(xtensa_mx_pic_set_irq, mx,
+ mx->irq_inputs = qemu_allocate_irqs_orphan(xtensa_mx_pic_set_irq, mx,
mx->n_irq);
return mx;
}
diff --git a/hw/xtensa/pic_cpu.c b/hw/xtensa/pic_cpu.c
index 370a353f1e..c3163a8b6c 100644
--- a/hw/xtensa/pic_cpu.c
+++ b/hw/xtensa/pic_cpu.c
@@ -102,7 +102,7 @@ void xtensa_irq_init(CPUXtensaState *env)
{
unsigned i;
- env->irq_inputs = qemu_allocate_irqs(xtensa_set_irq, env,
+ env->irq_inputs = qemu_allocate_irqs_orphan(xtensa_set_irq, env,
env->config->ninterrupt);
if (xtensa_option_enabled(env->config, XTENSA_OPTION_TIMER_INTERRUPT)) {
env->time_base = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
@@ -118,7 +118,7 @@ void xtensa_irq_init(CPUXtensaState *env)
env->ext_irq_inputs[i] = env->irq_inputs[irq];
}
- env->runstall_irq = qemu_allocate_irq(xtensa_set_runstall, env, 0);
+ env->runstall_irq = qemu_allocate_irq_orphan(xtensa_set_runstall, env, 0);
}
qemu_irq *xtensa_get_extints(CPUXtensaState *env)
diff --git a/include/hw/core/irq.h b/include/hw/core/irq.h
index 299a4a9a8c..f984c02c14 100644
--- a/include/hw/core/irq.h
+++ b/include/hw/core/irq.h
@@ -77,25 +77,25 @@ void qemu_init_irqs(IRQState irq[], size_t count,
/* Returns an array of N IRQs. Each IRQ is assigned the argument handler and
* opaque data.
*/
-qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n);
+qemu_irq *qemu_allocate_irqs_orphan(qemu_irq_handler handler, void *opaque, int n);
/*
* Allocates a single IRQ. The irq is assigned with a handler, an opaque
* data and the interrupt number.
*/
-qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n);
+qemu_irq qemu_allocate_irq_orphan(qemu_irq_handler handler, void *opaque, int n);
/* Extends an Array of IRQs. Old IRQs have their handlers and opaque data
* preserved. New IRQs are assigned the argument handler and opaque data.
*/
-qemu_irq *qemu_extend_irqs(qemu_irq *old, int n_old, qemu_irq_handler handler,
+qemu_irq *qemu_extend_irqs_orphan(qemu_irq *old, int n_old, qemu_irq_handler handler,
void *opaque, int n);
void qemu_free_irqs(qemu_irq *s, int n);
void qemu_free_irq(qemu_irq irq);
/* Returns a new IRQ with opposite polarity. */
-qemu_irq qemu_irq_invert(qemu_irq irq);
+qemu_irq qemu_irq_invert_orphan(qemu_irq irq);
/* For internal use in qtest. */
void qemu_irq_set_observer(qemu_irq *gpio_in, qemu_irq_handler handler, int n);
diff --git a/scripts/coccinelle/qom-parent/irq-rename.cocci b/scripts/coccinelle/qom-parent/irq-rename.cocci
new file mode 100644
index 0000000000..5587c3a4f9
--- /dev/null
+++ b/scripts/coccinelle/qom-parent/irq-rename.cocci
@@ -0,0 +1,14 @@
+// Rename the IRQ allocation helpers to *_orphan() so the parented
+// variants can take the well-known names.
+@@ @@
+- qemu_allocate_irqs
++ qemu_allocate_irqs_orphan
+@@ @@
+- qemu_allocate_irq
++ qemu_allocate_irq_orphan
+@@ @@
+- qemu_extend_irqs
++ qemu_extend_irqs_orphan
+@@ @@
+- qemu_irq_invert
++ qemu_irq_invert_orphan
diff --git a/system/qtest.c b/system/qtest.c
index cf30123917..f38feaac89 100644
--- a/system/qtest.c
+++ b/system/qtest.c
@@ -346,7 +346,7 @@ void qtest_set_command_cb(bool (*pc_cb)(CharFrontend *chr, gchar **words))
static void qtest_install_gpio_out_intercept(DeviceState *dev, const char *name, int n)
{
qemu_irq *disconnected = g_new0(qemu_irq, 1);
- qemu_irq icpt = qemu_allocate_irq(qtest_irq_handler,
+ qemu_irq icpt = qemu_allocate_irq_orphan(qtest_irq_handler,
disconnected, n);
*disconnected = qdev_intercept_gpio_out(dev, icpt, name, n);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 109/134] irq: Reintroduce qemu_allocate_irq*() with a mandatory owner and name
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (107 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 108/134] irq: Rename qemu_allocate_irq*() and friends to *_orphan() Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 110/134] hw/pci, hw/usb, system: Give allocated IRQs an " Alexander Graf
` (25 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Add parented variants of the IRQ allocation helpers under the
well-known names, taking (Object *owner, const char *name, ...) as
their first two arguments:
qemu_allocate_irq(owner, name, handler, opaque, n)
qemu_allocate_irqs(owner, name, handler, opaque, n)
qemu_extend_irqs(owner, name, old, n_old, handler, opaque, n)
qemu_irq_invert(owner, name, irq)
The new IRQ object is created via object_new_child() so it lands
under @owner with a stable path. The array/extend variants suffix
"[*]" so callers pass a bare name and get name[0], name[1], ...
qemu_free_irq() is taught to unparent when the IRQ has a QOM parent,
so it works for both the *_orphan() and the parented allocation
paths during the transition.
The *_orphan() variants stay for now; later commits convert every
caller and delete them, at which point the /machine/unattached
fallback in qdev_connect_gpio_out_named() also goes away.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/core/irq.c | 45 ++++++++++++++++++++++++++++++++++++++++++-
include/hw/core/irq.h | 15 +++++++++++++++
2 files changed, 59 insertions(+), 1 deletion(-)
diff --git a/hw/core/irq.c b/hw/core/irq.c
index f8fdeb7e02..ee954eaf62 100644
--- a/hw/core/irq.c
+++ b/hw/core/irq.c
@@ -96,6 +96,38 @@ qemu_irq qemu_allocate_irq_orphan(qemu_irq_handler handler, void *opaque, int n)
return irq;
}
+qemu_irq qemu_allocate_irq(Object *owner, const char *name,
+ qemu_irq_handler handler, void *opaque, int n)
+{
+ IRQState *irq = IRQ(object_new_child(owner, name, TYPE_IRQ));
+ init_irq_fields(irq, handler, opaque, n);
+ return irq;
+}
+
+qemu_irq *qemu_extend_irqs(Object *owner, const char *name,
+ qemu_irq *old, int n_old,
+ qemu_irq_handler handler, void *opaque, int n)
+{
+ g_autofree char *propname = g_strdup_printf("%s[*]", name);
+ qemu_irq *s;
+ int i;
+
+ if (!old) {
+ n_old = 0;
+ }
+ s = old ? g_renew(qemu_irq, old, n + n_old) : g_new(qemu_irq, n);
+ for (i = n_old; i < n + n_old; i++) {
+ s[i] = qemu_allocate_irq(owner, propname, handler, opaque, i);
+ }
+ return s;
+}
+
+qemu_irq *qemu_allocate_irqs(Object *owner, const char *name,
+ qemu_irq_handler handler, void *opaque, int n)
+{
+ return qemu_extend_irqs(owner, name, NULL, 0, handler, opaque, n);
+}
+
void qemu_free_irqs(qemu_irq *s, int n)
{
int i;
@@ -107,7 +139,11 @@ void qemu_free_irqs(qemu_irq *s, int n)
void qemu_free_irq(qemu_irq irq)
{
- object_unref(OBJECT(irq));
+ if (irq && OBJECT(irq)->parent) {
+ object_unparent(OBJECT(irq));
+ } else {
+ object_unref(OBJECT(irq));
+ }
}
static void qemu_notirq(void *opaque, int line, int level)
@@ -124,6 +160,13 @@ qemu_irq qemu_irq_invert_orphan(qemu_irq irq)
return qemu_allocate_irq_orphan(qemu_notirq, irq, 0);
}
+qemu_irq qemu_irq_invert(Object *owner, const char *name, qemu_irq irq)
+{
+ /* The default state for IRQs is low, so raise the output now. */
+ qemu_irq_raise(irq);
+ return qemu_allocate_irq(owner, name, qemu_notirq, irq, 0);
+}
+
void qemu_irq_set_observer(qemu_irq *gpio_in, qemu_irq_handler handler, int n)
{
int i;
diff --git a/include/hw/core/irq.h b/include/hw/core/irq.h
index f984c02c14..5ccccd2697 100644
--- a/include/hw/core/irq.h
+++ b/include/hw/core/irq.h
@@ -85,6 +85,20 @@ qemu_irq *qemu_allocate_irqs_orphan(qemu_irq_handler handler, void *opaque, int
*/
qemu_irq qemu_allocate_irq_orphan(qemu_irq_handler handler, void *opaque, int n);
+/*
+ * Same as the *_orphan() variants above, but the new IRQ objects are
+ * parented under @owner with property name @name (or @name[*] for the
+ * array/extend variants). The reference is held by @owner; call
+ * qemu_free_irq() to unparent and free.
+ */
+qemu_irq qemu_allocate_irq(Object *owner, const char *name,
+ qemu_irq_handler handler, void *opaque, int n);
+qemu_irq *qemu_allocate_irqs(Object *owner, const char *name,
+ qemu_irq_handler handler, void *opaque, int n);
+qemu_irq *qemu_extend_irqs(Object *owner, const char *name,
+ qemu_irq *old, int n_old,
+ qemu_irq_handler handler, void *opaque, int n);
+
/* Extends an Array of IRQs. Old IRQs have their handlers and opaque data
* preserved. New IRQs are assigned the argument handler and opaque data.
*/
@@ -96,6 +110,7 @@ void qemu_free_irq(qemu_irq irq);
/* Returns a new IRQ with opposite polarity. */
qemu_irq qemu_irq_invert_orphan(qemu_irq irq);
+qemu_irq qemu_irq_invert(Object *owner, const char *name, qemu_irq irq);
/* For internal use in qtest. */
void qemu_irq_set_observer(qemu_irq *gpio_in, qemu_irq_handler handler, int n);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 110/134] hw/pci, hw/usb, system: Give allocated IRQs an owner and name
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (108 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 109/134] irq: Reintroduce qemu_allocate_irq*() with a mandatory owner and name Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 111/134] hw/i386, hw/xen: " Alexander Graf
` (24 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert pci_allocate_irq() and the qtest interceptor to the parented
qemu_allocate_irq() form so the IRQ objects land under the device
that owns their lifetime instead of /machine/unattached.
hw/usb/vt82c686-uhci-pci.c drops the IRQ set up by the base UHCI
class before installing its own; switch that from object_unref() to
qemu_free_irq() so it unparents the now-parented IRQ before freeing
it.
hw/pci/pci.c pci_allocate_irq() | OBJECT(pci_dev) | "intx-irq"
system/qtest.c qtest intercept | OBJECT(dev) | "qtest-icpt[*]"
hw/usb/vt82c686-uhci-pci.c | OBJECT(s) | "isa-irq"
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/pci/pci.c | 2 +-
hw/usb/vt82c686-uhci-pci.c | 4 ++--
system/qtest.c | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 9ba7bfd977..d92092b233 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -1869,7 +1869,7 @@ qemu_irq pci_allocate_irq(PCIDevice *pci_dev)
int intx = pci_intx(pci_dev);
assert(0 <= intx && intx < PCI_NUM_PINS);
- return qemu_allocate_irq_orphan(pci_irq_handler, pci_dev, intx);
+ return qemu_allocate_irq(OBJECT(pci_dev), "intx-irq", pci_irq_handler, pci_dev, intx);
}
void pci_set_irq(PCIDevice *pci_dev, int level)
diff --git a/hw/usb/vt82c686-uhci-pci.c b/hw/usb/vt82c686-uhci-pci.c
index b58b61e609..d8c9e98061 100644
--- a/hw/usb/vt82c686-uhci-pci.c
+++ b/hw/usb/vt82c686-uhci-pci.c
@@ -22,8 +22,8 @@ static void usb_uhci_vt82c686b_realize(PCIDevice *dev, Error **errp)
pci_set_long(pci_conf + 0xc0, 0x00002000);
usb_uhci_common_realize(dev, errp);
- object_unref(s->irq);
- s->irq = qemu_allocate_irq_orphan(uhci_isa_set_irq, s, 0);
+ qemu_free_irq(s->irq);
+ s->irq = qemu_allocate_irq(OBJECT(s), "isa-irq", uhci_isa_set_irq, s, 0);
}
static UHCIInfo uhci_info[] = {
diff --git a/system/qtest.c b/system/qtest.c
index f38feaac89..5ef99f9f23 100644
--- a/system/qtest.c
+++ b/system/qtest.c
@@ -346,7 +346,7 @@ void qtest_set_command_cb(bool (*pc_cb)(CharFrontend *chr, gchar **words))
static void qtest_install_gpio_out_intercept(DeviceState *dev, const char *name, int n)
{
qemu_irq *disconnected = g_new0(qemu_irq, 1);
- qemu_irq icpt = qemu_allocate_irq_orphan(qtest_irq_handler,
+ qemu_irq icpt = qemu_allocate_irq(OBJECT(dev), "qtest-icpt[*]", qtest_irq_handler,
disconnected, n);
*disconnected = qdev_intercept_gpio_out(dev, icpt, name, n);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 111/134] hw/i386, hw/xen: Give allocated IRQs an owner and name
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (109 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 110/134] hw/pci, hw/usb, system: Give allocated IRQs an " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 112/134] hw/arm: " Alexander Graf
` (23 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the IRQ allocation calls in hw/i386 and the Xen accelerator
to the parented form. Thread an Object *parent through the small
helpers that had none:
pc_gsi_create() -> +Object *parent
x86_allocate_cpu_irq() -> +Object *parent
xen_interrupt_controller_init() -> +Object *parent
Per-site owner/name:
pc.c pc_gsi_create() | parent | "gsi"
pc.c a20 line | parent | "a20"
pc_piix.c smi | OBJECT(machine) | "smi"
x86-cpu.c CPU IRQ | parent | "pic-cpu-irq"
microvm.c gsi | OBJECT(mms) | "gsi"
kvm/i8259.c | parent | "kvm-pic-irq"
xen-hvm.c | parent | "xen-irq"
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/i386/isapc.c | 2 +-
hw/i386/kvm/i8259.c | 2 +-
hw/i386/microvm.c | 4 ++--
hw/i386/pc.c | 10 +++++-----
hw/i386/pc_piix.c | 5 +++--
hw/i386/pc_q35.c | 2 +-
hw/i386/x86-cpu.c | 4 ++--
hw/i386/xen/xen-hvm.c | 4 ++--
include/hw/i386/pc.h | 2 +-
include/hw/i386/x86.h | 2 +-
include/hw/xen/xen.h | 2 +-
stubs/xen-hw-stub.c | 2 +-
12 files changed, 21 insertions(+), 20 deletions(-)
diff --git a/hw/i386/isapc.c b/hw/i386/isapc.c
index e8d5767b80..c9f2f14123 100644
--- a/hw/i386/isapc.c
+++ b/hw/i386/isapc.c
@@ -106,7 +106,7 @@ static void pc_init_isa(MachineState *machine)
}
}
- gsi_state = pc_gsi_create(&x86ms->gsi, false);
+ gsi_state = pc_gsi_create(OBJECT(machine), &x86ms->gsi, false);
isa_bus = isa_bus_new_bridge(OBJECT(machine), system_memory, system_io,
&error_abort);
diff --git a/hw/i386/kvm/i8259.c b/hw/i386/kvm/i8259.c
index 7ef7a0b487..db2847686b 100644
--- a/hw/i386/kvm/i8259.c
+++ b/hw/i386/kvm/i8259.c
@@ -136,7 +136,7 @@ qemu_irq *kvm_i8259_init(Object *parent, ISABus *bus)
i8259_init_chip(parent, TYPE_KVM_I8259, bus, true);
i8259_init_chip(parent, TYPE_KVM_I8259, bus, false);
- return qemu_allocate_irqs_orphan(kvm_pic_set_irq, NULL, ISA_NUM_IRQS);
+ return qemu_allocate_irqs(parent, "kvm-pic-irq", kvm_pic_set_irq, NULL, ISA_NUM_IRQS);
}
static void kvm_i8259_class_init(ObjectClass *klass, const void *data)
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 07dbe3a18b..4c1a4d5661 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -168,7 +168,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
/* Core components */
ioapics = microvm_ioapics(mms);
gsi_state = g_malloc0(sizeof(*gsi_state));
- x86ms->gsi = qemu_allocate_irqs_orphan(gsi_handler, gsi_state,
+ x86ms->gsi = qemu_allocate_irqs(OBJECT(mms), "gsi", gsi_handler, gsi_state,
IOAPIC_NUM_PINS * ioapics);
isa_bus = isa_bus_new_bridge(OBJECT(mms), get_system_memory(), get_system_io(),
@@ -252,7 +252,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
qemu_irq *i8259;
- i8259 = i8259_init(OBJECT(mms), isa_bus, x86_allocate_cpu_irq());
+ i8259 = i8259_init(OBJECT(mms), isa_bus, x86_allocate_cpu_irq(OBJECT(mms)));
for (i = 0; i < ISA_NUM_IRQS; i++) {
gsi_state->i8259_irq[i] = i8259[i];
}
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 249fa699c7..398371ff6f 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -192,7 +192,7 @@ const size_t pc_compat_4_1_len = G_N_ELEMENTS(pc_compat_4_1);
*/
#define PC_FW_DATA (0x20000 + 0x8000)
-GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
+GSIState *pc_gsi_create(Object *parent, qemu_irq **irqs, bool pci_enabled)
{
GSIState *s;
@@ -200,7 +200,7 @@ GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
if (kvm_ioapic_in_kernel()) {
kvm_pc_setup_irq_routing(pci_enabled);
}
- *irqs = qemu_allocate_irqs_orphan(gsi_handler, s, IOAPIC_NUM_PINS);
+ *irqs = qemu_allocate_irqs(parent, "gsi", gsi_handler, s, IOAPIC_NUM_PINS);
return s;
}
@@ -1028,7 +1028,7 @@ static void pc_superio_init(Object *parent, ISABus *isa_bus, bool create_fdctrl,
}
port92 = isa_create_simple(parent, "port92", isa_bus, TYPE_PORT92);
- a20_line = qemu_allocate_irqs_orphan(handle_a20_line_change, first_cpu, 2);
+ a20_line = qemu_allocate_irqs(parent, "a20", handle_a20_line_change, first_cpu, 2);
qdev_connect_gpio_out_named(DEVICE(i8042),
I8042_A20_LINE, 0, a20_line[0]);
qdev_connect_gpio_out_named(DEVICE(port92),
@@ -1167,9 +1167,9 @@ void pc_i8259_create(Object *parent, ISABus *isa_bus, qemu_irq *i8259_irqs)
if (kvm_pic_in_kernel()) {
i8259 = kvm_i8259_init(parent, isa_bus);
} else if (xen_enabled()) {
- i8259 = xen_interrupt_controller_init();
+ i8259 = xen_interrupt_controller_init(parent);
} else {
- i8259 = i8259_init(parent, isa_bus, x86_allocate_cpu_irq());
+ i8259 = i8259_init(parent, isa_bus, x86_allocate_cpu_irq(parent));
}
for (size_t i = 0; i < ISA_NUM_IRQS; i++) {
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index f76d684d6b..976c646822 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -233,7 +233,7 @@ static void pc_init1(MachineState *machine, const char *pci_type)
}
}
- gsi_state = pc_gsi_create(&x86ms->gsi, true);
+ gsi_state = pc_gsi_create(OBJECT(machine), &x86ms->gsi, true);
pci_dev = pci_new_multifunction(OBJECT(machine), "south-bridge", -1,
pcms->south_bridge);
@@ -299,7 +299,8 @@ static void pc_init1(MachineState *machine, const char *pci_type)
pc_nic_init(pcmc, isa_bus, pcms->pcibus);
if (piix4_pm) {
- smi_irq = qemu_allocate_irq_orphan(pc_acpi_smi_interrupt, first_cpu, 0);
+ smi_irq = qemu_allocate_irq(OBJECT(machine), "smi",
+ pc_acpi_smi_interrupt, first_cpu, 0);
qdev_connect_gpio_out_named(DEVICE(piix4_pm), "smi-irq", 0, smi_irq);
pcms->smbus = I2C_BUS(qdev_get_child_bus(DEVICE(piix4_pm), "i2c"));
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index b2cdca8ade..b6a79d2e13 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -233,7 +233,7 @@ static void pc_q35_init(MachineState *machine)
pcms->pcibus = PCI_BUS(qdev_get_child_bus(DEVICE(phb), "pcie.0"));
/* irq lines */
- gsi_state = pc_gsi_create(&x86ms->gsi, true);
+ gsi_state = pc_gsi_create(OBJECT(machine), &x86ms->gsi, true);
/* create ISA bus */
lpc = pci_new_multifunction(OBJECT(machine), "lpc",
diff --git a/hw/i386/x86-cpu.c b/hw/i386/x86-cpu.c
index 6d010291cf..f92acf2778 100644
--- a/hw/i386/x86-cpu.c
+++ b/hw/i386/x86-cpu.c
@@ -61,9 +61,9 @@ static void pic_irq_request(void *opaque, int irq, int level)
}
}
-qemu_irq x86_allocate_cpu_irq(void)
+qemu_irq x86_allocate_cpu_irq(Object *parent)
{
- return qemu_allocate_irq_orphan(pic_irq_request, NULL, 0);
+ return qemu_allocate_irq(parent, "pic-cpu-irq", pic_irq_request, NULL, 0);
}
int cpu_get_pic_interrupt(CPUX86State *env)
diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c
index e87c8237ea..e19c9723da 100644
--- a/hw/i386/xen/xen-hvm.c
+++ b/hw/i386/xen/xen-hvm.c
@@ -112,9 +112,9 @@ static void xen_set_irq(void *opaque, int irq, int level)
xen_set_isa_irq_level(xen_domid, irq, level);
}
-qemu_irq *xen_interrupt_controller_init(void)
+qemu_irq *xen_interrupt_controller_init(Object *parent)
{
- return qemu_allocate_irqs_orphan(xen_set_irq, NULL, 16);
+ return qemu_allocate_irqs(parent, "xen-irq", xen_set_irq, NULL, 16);
}
/* Memory Ops */
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index a059409243..15e4cca288 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -126,7 +126,7 @@ OBJECT_DECLARE_TYPE(PCMachineState, PCMachineClass, PC_MACHINE)
/* ioapic.c */
-GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled);
+GSIState *pc_gsi_create(Object *parent, qemu_irq **irqs, bool pci_enabled);
/* pc.c */
diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
index 9d5d7694d4..a21b5d1384 100644
--- a/include/hw/i386/x86.h
+++ b/include/hw/i386/x86.h
@@ -145,7 +145,7 @@ typedef struct GSIState {
qemu_irq ioapic2_irq[IOAPIC_NUM_PINS];
} GSIState;
-qemu_irq x86_allocate_cpu_irq(void);
+qemu_irq x86_allocate_cpu_irq(Object *parent);
void gsi_handler(void *opaque, int n, int level);
void ioapic_init_gsi(GSIState *gsi_state, Object *parent);
DeviceState *ioapic_init_secondary(Object *parent, GSIState *gsi_state);
diff --git a/include/hw/xen/xen.h b/include/hw/xen/xen.h
index e94c6e5a31..83b7f6c3aa 100644
--- a/include/hw/xen/xen.h
+++ b/include/hw/xen/xen.h
@@ -42,7 +42,7 @@ void xen_intx_set_irq(void *opaque, int irq_num, int level);
void xen_hvm_inject_msi(uint64_t addr, uint32_t data);
int xen_is_pirq_msi(uint32_t msi_data);
-qemu_irq *xen_interrupt_controller_init(void);
+qemu_irq *xen_interrupt_controller_init(Object *parent);
void xen_register_framebuffer(struct MemoryRegion *mr);
diff --git a/stubs/xen-hw-stub.c b/stubs/xen-hw-stub.c
index 6cf0e9a4c1..4ea666cac8 100644
--- a/stubs/xen-hw-stub.c
+++ b/stubs/xen-hw-stub.c
@@ -29,7 +29,7 @@ int xen_is_pirq_msi(uint32_t msi_data)
return 0;
}
-qemu_irq *xen_interrupt_controller_init(void)
+qemu_irq *xen_interrupt_controller_init(Object *parent)
{
return NULL;
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 112/134] hw/arm: Give allocated IRQs an owner and name
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (110 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 111/134] hw/i386, hw/xen: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 113/134] hw/xtensa: " Alexander Graf
` (22 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the IRQ allocation calls in hw/arm boards and the OMAP
peripheral models to the parented form. Thread an Object *owner
through the small helpers that had none:
omap_timer_clk_setup() -> +Object *owner
omap_mcbsp_i2s_attach() -> +Object *owner (no callers, kept for API)
The OMAP init helpers are called multiple times from
omap310_mpu_init() so their IRQ names use the auto-index [*] form.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/armsse.c | 5 +++--
hw/arm/exynos4_boards.c | 3 ++-
hw/arm/mps2-tz.c | 3 ++-
hw/arm/omap1.c | 29 +++++++++++++++++------------
hw/arm/realview.c | 3 ++-
hw/arm/stellaris.c | 15 ++++++++++-----
hw/dma/omap_dma.c | 5 +++--
hw/timer/arm_timer.c | 6 ++++--
include/hw/arm/omap.h | 2 +-
9 files changed, 44 insertions(+), 27 deletions(-)
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
index 93f6715224..b25f058020 100644
--- a/hw/arm/armsse.c
+++ b/hw/arm/armsse.c
@@ -693,7 +693,8 @@ static void armsse_forward_sec_resp_cfg(ARMSSE *s)
DeviceState *dev_splitter = DEVICE(&s->sec_resp_splitter);
qdev_init_gpio_out_named(dev, &s->sec_resp_cfg, "sec_resp_cfg", 1);
- s->sec_resp_cfg_in = qemu_allocate_irq_orphan(irq_status_forwarder,
+ s->sec_resp_cfg_in = qemu_allocate_irq(OBJECT(s), "sec-resp-cfg-in",
+ irq_status_forwarder,
s->sec_resp_cfg, 1);
qdev_connect_gpio_out(dev_splitter, 2, s->sec_resp_cfg_in);
}
@@ -1137,7 +1138,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
sysbus_mmio_map(sbd_secctl, 0, 0x50080000);
sysbus_mmio_map(sbd_secctl, 1, 0x40080000);
- s->nsc_cfg_in = qemu_allocate_irq_orphan(nsccfg_handler, s, 1);
+ s->nsc_cfg_in = qemu_allocate_irq(OBJECT(dev), "nsc-cfg-in", nsccfg_handler, s, 1);
qdev_connect_gpio_out_named(dev_secctl, "nsc_cfg", 0, s->nsc_cfg_in);
/* The sec_resp_cfg output from the security controller must be split into
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index 537a50f8cc..4f5c99e301 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -146,7 +146,8 @@ static void smdkc210_init(MachineState *machine)
EXYNOS4_BOARD_SMDKC210);
lan9215_init(SMDK_LAN9118_BASE_ADDR,
- qemu_irq_invert_orphan(s->soc.irq_table[exynos4210_get_irq(37, 1)]));
+ qemu_irq_invert(OBJECT(machine), "lan9118-irq-inv",
+ s->soc.irq_table[exynos4210_get_irq(37, 1)]));
arm_load_kernel(s->soc.cpu[0], machine, &exynos4_board_binfo);
}
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
index 654eaedd97..ea94f1a6dd 100644
--- a/hw/arm/mps2-tz.c
+++ b/hw/arm/mps2-tz.c
@@ -1209,7 +1209,8 @@ static void mps2tz_common_init(MachineState *machine)
* Connect the line from the SCC so that we can remap when the
* guest updates that register.
*/
- mms->remap_irq = qemu_allocate_irq_orphan(remap_irq_fn, mms, 0);
+ mms->remap_irq = qemu_allocate_irq(OBJECT(machine), "remap-irq",
+ remap_irq_fn, mms, 0);
qdev_connect_gpio_out_named(DEVICE(&mms->scc), "remap", 0,
mms->remap_irq);
}
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index 53e52ef34e..c193b41f5b 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -136,10 +136,11 @@ static void omap_timer_clk_update(void *opaque, int line, int on)
omap_timer_update(timer);
}
-static void omap_timer_clk_setup(struct omap_mpu_timer_s *timer)
+static void omap_timer_clk_setup(Object *owner, struct omap_mpu_timer_s *timer)
{
omap_clk_adduser(timer->clk,
- qemu_allocate_irq_orphan(omap_timer_clk_update, timer, 0));
+ qemu_allocate_irq(owner, "rate-irq[*]",
+ omap_timer_clk_update, timer, 0));
timer->rate = omap_clk_getrate(timer->clk);
}
@@ -232,7 +233,7 @@ static struct omap_mpu_timer_s *omap_mpu_timer_init(Object *owner,
s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, omap_timer_tick, s);
s->tick = qemu_bh_new(omap_timer_fire, s);
omap_mpu_timer_reset(s);
- omap_timer_clk_setup(s);
+ omap_timer_clk_setup(owner, s);
memory_region_init_io(&s->iomem, owner, &omap_mpu_timer_ops, s,
"omap-mpu-timer", 0x100);
@@ -363,7 +364,7 @@ static struct omap_watchdog_timer_s *omap_wd_timer_init(Object *owner,
s->timer.clk = clk;
s->timer.timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, omap_timer_tick, &s->timer);
omap_wd_timer_reset(s);
- omap_timer_clk_setup(&s->timer);
+ omap_timer_clk_setup(owner, &s->timer);
memory_region_init_io(&s->iomem, owner, &omap_wd_timer_ops, s,
"omap-wd-timer", 0x100);
@@ -472,7 +473,7 @@ static struct omap_32khz_timer_s *omap_os_timer_init(Object *owner,
s->timer.clk = clk;
s->timer.timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, omap_timer_tick, &s->timer);
omap_os_timer_reset(s);
- omap_timer_clk_setup(&s->timer);
+ omap_timer_clk_setup(owner, &s->timer);
memory_region_init_io(&s->iomem, owner, &omap_os_timer_ops, s,
"omap-os-timer", 0x800);
@@ -2083,14 +2084,15 @@ static struct omap_mpuio_s *omap_mpuio_init(Object *owner,
s->irq = gpio_int;
s->kbd_irq = kbd_int;
- s->in = qemu_allocate_irqs_orphan(omap_mpuio_set, s, 16);
+ s->in = qemu_allocate_irqs(owner, "mpuio-in", omap_mpuio_set, s, 16);
omap_mpuio_reset(s);
memory_region_init_io(&s->iomem, owner, &omap_mpuio_ops, s,
"omap-mpuio", 0x800);
memory_region_add_subregion(memory, base, &s->iomem);
- omap_clk_adduser(clk, qemu_allocate_irq_orphan(omap_mpuio_onoff, s, 0));
+ omap_clk_adduser(clk, qemu_allocate_irq(owner, "mpuio-clk-onoff[*]",
+ omap_mpuio_onoff, s, 0));
return s;
}
@@ -2363,7 +2365,8 @@ static struct omap_pwl_s *omap_pwl_init(Object *owner,
"omap-pwl", 0x800);
memory_region_add_subregion(system_memory, base, &s->iomem);
- omap_clk_adduser(clk, qemu_allocate_irq_orphan(omap_pwl_clk_update, s, 0));
+ omap_clk_adduser(clk, qemu_allocate_irq(owner, "pwl-clk-irq[*]",
+ omap_pwl_clk_update, s, 0));
return s;
}
@@ -3423,11 +3426,12 @@ static void omap_mcbsp_i2s_start(void *opaque, int line, int level)
}
}
-void omap_mcbsp_i2s_attach(struct omap_mcbsp_s *s, I2SCodec *slave)
+void omap_mcbsp_i2s_attach(Object *owner, struct omap_mcbsp_s *s, I2SCodec *slave)
{
s->codec = slave;
- slave->rx_swallow = qemu_allocate_irq_orphan(omap_mcbsp_i2s_swallow, s, 0);
- slave->tx_start = qemu_allocate_irq_orphan(omap_mcbsp_i2s_start, s, 0);
+ slave->rx_swallow = qemu_allocate_irq(owner, "rx-swallow[*]",
+ omap_mcbsp_i2s_swallow, s, 0);
+ slave->tx_start = qemu_allocate_irq(owner, "tx-start[*]", omap_mcbsp_i2s_start, s, 0);
}
/* LED Pulse Generators */
@@ -3579,7 +3583,8 @@ static struct omap_lpg_s *omap_lpg_init(Object *owner,
"omap-lpg", 0x800);
memory_region_add_subregion(system_memory, base, &s->iomem);
- omap_clk_adduser(clk, qemu_allocate_irq_orphan(omap_lpg_clk_update, s, 0));
+ omap_clk_adduser(clk, qemu_allocate_irq(owner, "lpg-clk-irq[*]",
+ omap_lpg_clk_update, s, 0));
return s;
}
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index cd63f39f42..99591e7d80 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -276,7 +276,8 @@ static void realview_init(MachineState *machine,
split_irq_from_named(OBJECT(machine), dev, "card-inserted",
qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_CARDIN),
- qemu_irq_invert_orphan(qdev_get_gpio_in(gpio2, 0)));
+ qemu_irq_invert(OBJECT(machine), "mmc-cd-inv",
+ qdev_get_gpio_in(gpio2, 0)));
dinfo = drive_get(IF_SD, 0, 0);
if (dinfo) {
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index a5d037094a..a0986dbfe8 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1358,15 +1358,20 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
sysbus_realize(SYS_BUS_DEVICE(gpad), &error_fatal);
qdev_connect_gpio_out(gpad, 0,
- qemu_irq_invert_orphan(gpio_in[GPIO_E][0])); /* up */
+ qemu_irq_invert(OBJECT(ms), "gpio-in-irq[*]",
+ gpio_in[GPIO_E][0])); /* up */
qdev_connect_gpio_out(gpad, 1,
- qemu_irq_invert_orphan(gpio_in[GPIO_E][1])); /* down */
+ qemu_irq_invert(OBJECT(ms), "gpio-in-irq[*]",
+ gpio_in[GPIO_E][1])); /* down */
qdev_connect_gpio_out(gpad, 2,
- qemu_irq_invert_orphan(gpio_in[GPIO_E][2])); /* left */
+ qemu_irq_invert(OBJECT(ms), "gpio-in-irq[*]",
+ gpio_in[GPIO_E][2])); /* left */
qdev_connect_gpio_out(gpad, 3,
- qemu_irq_invert_orphan(gpio_in[GPIO_E][3])); /* right */
+ qemu_irq_invert(OBJECT(ms), "gpio-in-irq[*]",
+ gpio_in[GPIO_E][3])); /* right */
qdev_connect_gpio_out(gpad, 4,
- qemu_irq_invert_orphan(gpio_in[GPIO_F][1])); /* select */
+ qemu_irq_invert(OBJECT(ms), "gpio-in-irq[*]",
+ gpio_in[GPIO_F][1])); /* select */
}
for (i = 0; i < 7; i++) {
if (board->dc4 & (1 << i)) {
diff --git a/hw/dma/omap_dma.c b/hw/dma/omap_dma.c
index 7a2a3310f9..7efb7a8b9a 100644
--- a/hw/dma/omap_dma.c
+++ b/hw/dma/omap_dma.c
@@ -1109,7 +1109,7 @@ struct soc_dma_s *omap_dma_init(Object *owner, hwaddr base, qemu_irq *irqs,
s->dma->freq = omap_clk_getrate(clk);
s->dma->transfer_fn = omap_dma_transfer_generic;
s->dma->setup_fn = omap_dma_transfer_setup;
- s->dma->drq = qemu_allocate_irqs_orphan(omap_dma_request, s, 32);
+ s->dma->drq = qemu_allocate_irqs(owner, "drq", omap_dma_request, s, 32);
s->dma->opaque = s;
while (num_irqs --)
@@ -1123,7 +1123,8 @@ struct soc_dma_s *omap_dma_init(Object *owner, hwaddr base, qemu_irq *irqs,
s->dma->ch[i].opaque = &s->ch[i];
}
- omap_clk_adduser(s->clk, qemu_allocate_irq_orphan(omap_dma_clk_update, s, 0));
+ omap_clk_adduser(s->clk, qemu_allocate_irq(owner, "clk-irq",
+ omap_dma_clk_update, s, 0));
omap_dma_reset(s->dma);
omap_dma_clk_update(s, 0, 1);
diff --git a/hw/timer/arm_timer.c b/hw/timer/arm_timer.c
index 1c29db12a2..42ccc99b1e 100644
--- a/hw/timer/arm_timer.c
+++ b/hw/timer/arm_timer.c
@@ -305,8 +305,10 @@ static void sp804_realize(DeviceState *dev, Error **errp)
s->timer[0] = arm_timer_init(s->freq0);
s->timer[1] = arm_timer_init(s->freq1);
- s->timer[0]->irq = qemu_allocate_irq_orphan(sp804_set_irq, s, 0);
- s->timer[1]->irq = qemu_allocate_irq_orphan(sp804_set_irq, s, 1);
+ s->timer[0]->irq = qemu_allocate_irq(OBJECT(dev), "timer-irq[*]",
+ sp804_set_irq, s, 0);
+ s->timer[1]->irq = qemu_allocate_irq(OBJECT(dev), "timer-irq[*]",
+ sp804_set_irq, s, 1);
}
/* Integrator/CP timer module. */
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
index 591abf752b..a4267ef30a 100644
--- a/include/hw/arm/omap.h
+++ b/include/hw/arm/omap.h
@@ -291,7 +291,7 @@ struct I2SCodec {
} in, out;
};
struct omap_mcbsp_s;
-void omap_mcbsp_i2s_attach(struct omap_mcbsp_s *s, I2SCodec *slave);
+void omap_mcbsp_i2s_attach(Object *owner, struct omap_mcbsp_s *s, I2SCodec *slave);
/* omap_lcdc.c */
struct omap_lcd_panel_s;
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 113/134] hw/xtensa: Give allocated IRQs an owner and name
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (111 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 112/134] hw/arm: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 114/134] hw: " Alexander Graf
` (21 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Thread an Object *owner through xtensa_mx_pic_init() and use the CPU
object as owner for the per-CPU IRQ input arrays.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/xtensa/mx_pic.c | 4 ++--
hw/xtensa/pic_cpu.c | 5 +++--
hw/xtensa/xtfpga.c | 2 +-
include/hw/xtensa/mx_pic.h | 2 +-
4 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/hw/xtensa/mx_pic.c b/hw/xtensa/mx_pic.c
index 9959bec5f2..f698d592f0 100644
--- a/hw/xtensa/mx_pic.c
+++ b/hw/xtensa/mx_pic.c
@@ -341,12 +341,12 @@ static void xtensa_mx_pic_set_irq(void *opaque, int irq, int active)
}
}
-XtensaMxPic *xtensa_mx_pic_init(unsigned n_irq)
+XtensaMxPic *xtensa_mx_pic_init(Object *owner, unsigned n_irq)
{
XtensaMxPic *mx = g_new0(XtensaMxPic, 1);
mx->n_irq = n_irq + 1;
- mx->irq_inputs = qemu_allocate_irqs_orphan(xtensa_mx_pic_set_irq, mx,
+ mx->irq_inputs = qemu_allocate_irqs(owner, "irq", xtensa_mx_pic_set_irq, mx,
mx->n_irq);
return mx;
}
diff --git a/hw/xtensa/pic_cpu.c b/hw/xtensa/pic_cpu.c
index c3163a8b6c..496c83a298 100644
--- a/hw/xtensa/pic_cpu.c
+++ b/hw/xtensa/pic_cpu.c
@@ -100,9 +100,10 @@ static void xtensa_set_runstall(void *opaque, int irq, int active)
void xtensa_irq_init(CPUXtensaState *env)
{
+ Object *cpu = OBJECT(env_cpu(env));
unsigned i;
- env->irq_inputs = qemu_allocate_irqs_orphan(xtensa_set_irq, env,
+ env->irq_inputs = qemu_allocate_irqs(cpu, "irq-in", xtensa_set_irq, env,
env->config->ninterrupt);
if (xtensa_option_enabled(env->config, XTENSA_OPTION_TIMER_INTERRUPT)) {
env->time_base = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
@@ -118,7 +119,7 @@ void xtensa_irq_init(CPUXtensaState *env)
env->ext_irq_inputs[i] = env->irq_inputs[irq];
}
- env->runstall_irq = qemu_allocate_irq_orphan(xtensa_set_runstall, env, 0);
+ env->runstall_irq = qemu_allocate_irq(cpu, "runstall", xtensa_set_runstall, env, 0);
}
qemu_irq *xtensa_get_extints(CPUXtensaState *env)
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index f0c21180a2..6ec0822a96 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -247,7 +247,7 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
Object *mo = OBJECT(machine);
if (smp_cpus > 1) {
- mx_pic = xtensa_mx_pic_init(31);
+ mx_pic = xtensa_mx_pic_init(mo, 31);
qemu_register_reset(xtensa_mx_pic_reset, mx_pic);
}
for (n = 0; n < smp_cpus; n++) {
diff --git a/include/hw/xtensa/mx_pic.h b/include/hw/xtensa/mx_pic.h
index 01d5ea884e..212cf91e78 100644
--- a/include/hw/xtensa/mx_pic.h
+++ b/include/hw/xtensa/mx_pic.h
@@ -33,7 +33,7 @@
struct XtensaMxPic;
typedef struct XtensaMxPic XtensaMxPic;
-XtensaMxPic *xtensa_mx_pic_init(unsigned n_extint);
+XtensaMxPic *xtensa_mx_pic_init(Object *owner, unsigned n_extint);
void xtensa_mx_pic_reset(void *opaque);
MemoryRegion *xtensa_mx_pic_register_cpu(Object *owner, XtensaMxPic *mx,
qemu_irq *irq,
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 114/134] hw: Give allocated IRQs an owner and name
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (112 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 113/134] hw/xtensa: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 115/134] hw/core: Parent GPIO input IRQs and embedded IRQState via QOM Alexander Graf
` (20 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Convert the remaining IRQ allocation calls across hw/ to the parented
form. Owner is the enclosing device for realize()-time allocations
and the machine for board-init allocations. Names describe the pin's
purpose; the auto-indexed [*] form is used where the same allocation
runs in a loop.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/alpha/typhoon.c | 4 ++--
hw/char/diva-gsp.c | 3 ++-
hw/display/macfb.c | 2 +-
hw/ide/ahci.c | 2 +-
hw/ide/pci.c | 2 +-
hw/intc/sh_intc.c | 2 +-
hw/isa/i82378.c | 3 ++-
hw/isa/lpc_ich9.c | 2 +-
hw/m68k/mcf5206.c | 2 +-
hw/m68k/q800.c | 4 ++--
hw/mips/mips_int.c | 2 +-
hw/net/can/can_kvaser_pci.c | 2 +-
hw/pci-host/pnv_phb3.c | 3 ++-
hw/pci-host/pnv_phb3_msi.c | 3 ++-
hw/pci-host/pnv_phb4.c | 3 ++-
hw/ppc/e500.c | 3 ++-
hw/ppc/pnv_lpc.c | 2 +-
hw/ppc/pnv_psi.c | 6 ++++--
hw/ppc/spapr_irq.c | 2 +-
hw/riscv/sifive_u.c | 3 ++-
hw/scsi/esp-pci.c | 2 +-
hw/sh4/sh7750.c | 2 +-
hw/sparc/sun4m.c | 5 +++--
hw/sparc64/sun4u.c | 3 ++-
hw/xen/xen-pvh-common.c | 5 +++--
25 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
index 671e8f89d9..bc2073bfa9 100644
--- a/hw/alpha/typhoon.c
+++ b/hw/alpha/typhoon.c
@@ -849,8 +849,8 @@ PCIBus *typhoon_init(Object *parent, MemoryRegion *ram, qemu_irq *p_isa_irq,
}
}
- *p_isa_irq = qemu_allocate_irq_orphan(typhoon_set_isa_irq, s, 0);
- *p_rtc_irq = qemu_allocate_irq_orphan(typhoon_set_timer_irq, s, 0);
+ *p_isa_irq = qemu_allocate_irq(parent, "isa-irq", typhoon_set_isa_irq, s, 0);
+ *p_rtc_irq = qemu_allocate_irq(parent, "rtc-irq", typhoon_set_timer_irq, s, 0);
/* Main memory region, 0x00.0000.0000. Real hardware supports 32GB,
but the address space hole reserved at this point is 8TB. */
diff --git a/hw/char/diva-gsp.c b/hw/char/diva-gsp.c
index bf1da1faee..b70811f24f 100644
--- a/hw/char/diva-gsp.c
+++ b/hw/char/diva-gsp.c
@@ -126,7 +126,8 @@ static void diva_pci_realize(PCIDevice *dev, Error **errp)
pci->dev.config[PCI_INTERRUPT_PIN] = 1;
memory_region_init(&pci->membar, OBJECT(pci), "serial_ports", 4096);
pci_register_bar(&pci->dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &pci->membar);
- pci->irqs = qemu_allocate_irqs_orphan(multi_serial_irq_mux, pci, di.nports);
+ pci->irqs = qemu_allocate_irqs(OBJECT(dev), "serial-irq",
+ multi_serial_irq_mux, pci, di.nports);
for (i = 0; i < di.nports; i++) {
s = pci->state + i;
diff --git a/hw/display/macfb.c b/hw/display/macfb.c
index de5c83884e..b59523a0ac 100644
--- a/hw/display/macfb.c
+++ b/hw/display/macfb.c
@@ -737,7 +737,7 @@ static void macfb_nubus_realize(DeviceState *dev, Error **errp)
memory_region_add_subregion(&nd->slot_mem, DAFB_BASE, &ms->mem_ctrl);
memory_region_add_subregion(&nd->slot_mem, VIDEO_BASE, &ms->mem_vram);
- ms->irq = qemu_allocate_irq_orphan(macfb_nubus_set_irq, s, 0);
+ ms->irq = qemu_allocate_irq(OBJECT(dev), "nubus-irq", macfb_nubus_set_irq, s, 0);
}
static void macfb_nubus_unrealize(DeviceState *dev)
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index ac1cf26bab..b8f4e018b9 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -1594,7 +1594,7 @@ void ahci_realize(AHCIState *s, DeviceState *qdev, AddressSpace *as)
assert(s->ports > 0);
s->dev = g_new0(AHCIDevice, s->ports);
ahci_reg_init(s);
- irqs = qemu_allocate_irqs_orphan(ahci_irq_set, s, s->ports);
+ irqs = qemu_allocate_irqs(OBJECT(qdev), "port-irq", ahci_irq_set, s, s->ports);
for (i = 0; i < s->ports; i++) {
AHCIDevice *ad = &s->dev[i];
diff --git a/hw/ide/pci.c b/hw/ide/pci.c
index c808469008..56750b7b6f 100644
--- a/hw/ide/pci.c
+++ b/hw/ide/pci.c
@@ -606,7 +606,7 @@ void bmdma_init(IDEBus *bus, BMDMAState *bm, PCIIDEState *d)
bm->dma.ops = &bmdma_ops;
bus->dma = &bm->dma;
bm->irq = bus->irq;
- bus->irq = qemu_allocate_irq_orphan(bmdma_irq, bm, 0);
+ bus->irq = qemu_allocate_irq(OBJECT(d), "bmdma-irq[*]", bmdma_irq, bm, 0);
bm->bus = bus;
bm->pci_dev = d;
}
diff --git a/hw/intc/sh_intc.c b/hw/intc/sh_intc.c
index 63f4eee2aa..4eaaeefeea 100644
--- a/hw/intc/sh_intc.c
+++ b/hw/intc/sh_intc.c
@@ -403,7 +403,7 @@ int sh_intc_init(Object *owner, MemoryRegion *sysmem,
for (i = 0; i < nr_sources; i++) {
desc->sources[i].parent = desc;
}
- desc->irqs = qemu_allocate_irqs_orphan(sh_intc_set_irq, desc, nr_sources);
+ desc->irqs = qemu_allocate_irqs(owner, "src-irq", sh_intc_set_irq, desc, nr_sources);
memory_region_init_io(&desc->iomem, owner, &sh_intc_ops, desc, "intc",
0x100000000ULL);
j = 0;
diff --git a/hw/isa/i82378.c b/hw/isa/i82378.c
index 4f0be992e0..263a0c0dcf 100644
--- a/hw/isa/i82378.c
+++ b/hw/isa/i82378.c
@@ -95,7 +95,8 @@ static void i82378_realize(PCIDevice *pci, Error **errp)
/* 2 82C59 (irq) */
s->isa_irqs_in = i8259_init(OBJECT(pci), isabus,
- qemu_allocate_irq_orphan(i82378_request_out0_irq,
+ qemu_allocate_irq(OBJECT(dev), "out0-irq",
+ i82378_request_out0_irq,
s, 0));
isa_bus_register_input_irqs(isabus, s->isa_irqs_in);
diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
index 7cb82519fb..7b44423372 100644
--- a/hw/isa/lpc_ich9.c
+++ b/hw/isa/lpc_ich9.c
@@ -429,7 +429,7 @@ static void ich9_lpc_pm_init(ICH9LPCState *lpc)
qemu_irq sci_irq;
FWCfgState *fw_cfg = fw_cfg_find();
- sci_irq = qemu_allocate_irq_orphan(ich9_set_sci, lpc, 0);
+ sci_irq = qemu_allocate_irq(OBJECT(lpc), "sci-irq", ich9_set_sci, lpc, 0);
ich9_pm_init(PCI_DEVICE(lpc), &lpc->pm, sci_irq);
if (lpc->smi_host_features && fw_cfg) {
diff --git a/hw/m68k/mcf5206.c b/hw/m68k/mcf5206.c
index cbb361fae9..ec70d482eb 100644
--- a/hw/m68k/mcf5206.c
+++ b/hw/m68k/mcf5206.c
@@ -593,7 +593,7 @@ static void mcf5206_mbar_realize(DeviceState *dev, Error **errp)
"mbar", 0x00001000);
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
- s->pic = qemu_allocate_irqs_orphan(m5206_mbar_set_irq, s, 14);
+ s->pic = qemu_allocate_irqs(OBJECT(dev), "pic-irq", m5206_mbar_set_irq, s, 14);
m5206_timer_init(&s->timer[0], s->pic[9]);
m5206_timer_init(&s->timer[1], s->pic[10]);
s->uart[0] = mcf_uart_create(OBJECT(s), s->pic[12], serial_hd(0));
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 177fff0289..677dc4ad80 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -474,11 +474,11 @@ static void q800_machine_init(MachineState *machine)
sysbus_realize(sysbus, &error_fatal);
/* SCSI and SCSI data IRQs are negative edge triggered */
sysbus_connect_irq(sysbus, 0,
- qemu_irq_invert_orphan(
+ qemu_irq_invert(OBJECT(machine), "scsi-irq-inv",
qdev_get_gpio_in(DEVICE(&m->via2),
VIA2_IRQ_SCSI_BIT)));
sysbus_connect_irq(sysbus, 1,
- qemu_irq_invert_orphan(
+ qemu_irq_invert(OBJECT(machine), "scsi-drq-inv",
qdev_get_gpio_in(DEVICE(&m->via2),
VIA2_IRQ_SCSI_DATA_BIT)));
memory_region_add_subregion(&m->macio, ESP_BASE - IO_BASE,
diff --git a/hw/mips/mips_int.c b/hw/mips/mips_int.c
index 814d07319f..c404063762 100644
--- a/hw/mips/mips_int.c
+++ b/hw/mips/mips_int.c
@@ -56,7 +56,7 @@ void cpu_mips_irq_init_cpu(MIPSCPU *cpu)
qemu_irq *qi;
int i;
- qi = qemu_allocate_irqs_orphan(cpu_mips_irq_request, cpu, 8);
+ qi = qemu_allocate_irqs(OBJECT(cpu), "cpu-irq", cpu_mips_irq_request, cpu, 8);
for (i = 0; i < 8; i++) {
env->irq[i] = qi[i];
}
diff --git a/hw/net/can/can_kvaser_pci.c b/hw/net/can/can_kvaser_pci.c
index 69fc66de14..95bae684d6 100644
--- a/hw/net/can/can_kvaser_pci.c
+++ b/hw/net/can/can_kvaser_pci.c
@@ -224,7 +224,7 @@ static void kvaser_pci_realize(PCIDevice *pci_dev, Error **errp)
pci_conf = pci_dev->config;
pci_conf[PCI_INTERRUPT_PIN] = 0x01; /* interrupt pin A */
- d->irq = qemu_allocate_irq_orphan(kvaser_pci_irq_handler, d, 0);
+ d->irq = qemu_allocate_irq(OBJECT(s), "kvaser-irq", kvaser_pci_irq_handler, d, 0);
can_sja_init(s, d->irq);
diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
index 63da48f5af..410a27a073 100644
--- a/hw/pci-host/pnv_phb3.c
+++ b/hw/pci-host/pnv_phb3.c
@@ -1054,7 +1054,8 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
ics_set_irq_type(&phb->lsis, i, true);
}
- phb->qirqs = qemu_allocate_irqs_orphan(ics_set_irq, &phb->lsis, phb->lsis.nr_irqs);
+ phb->qirqs = qemu_allocate_irqs(OBJECT(dev), "lsi-irq",
+ ics_set_irq, &phb->lsis, phb->lsis.nr_irqs);
/* MSI sources */
object_property_set_link(OBJECT(&phb->msis), "phb", OBJECT(phb),
diff --git a/hw/pci-host/pnv_phb3_msi.c b/hw/pci-host/pnv_phb3_msi.c
index fa5f61ea2b..1bba60c616 100644
--- a/hw/pci-host/pnv_phb3_msi.c
+++ b/hw/pci-host/pnv_phb3_msi.c
@@ -267,7 +267,8 @@ static void phb3_msi_realize(DeviceState *dev, Error **errp)
return;
}
- msi->qirqs = qemu_allocate_irqs_orphan(phb3_msi_set_irq, msi, ics->nr_irqs);
+ msi->qirqs = qemu_allocate_irqs(OBJECT(dev), "msi-irq",
+ phb3_msi_set_irq, msi, ics->nr_irqs);
}
static void phb3_msi_instance_init(Object *obj)
diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c
index 7a1988a2b2..9b567413c7 100644
--- a/hw/pci-host/pnv_phb4.c
+++ b/hw/pci-host/pnv_phb4.c
@@ -1605,7 +1605,8 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp)
pnv_phb4_update_xsrc(phb);
- phb->qirqs = qemu_allocate_irqs_orphan(xive_source_set_irq, xsrc, xsrc->nr_irqs);
+ phb->qirqs = qemu_allocate_irqs(OBJECT(dev), "lsi-irq",
+ xive_source_set_irq, xsrc, xsrc->nr_irqs);
pnv_phb4_xscom_realize(phb);
}
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 62692f5776..f3917c0755 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -1089,7 +1089,8 @@ void ppce500_init(MachineState *machine)
sysbus_mmio_get_region(s, 0));
/* Power Off GPIO at Pin 0 */
- poweroff_irq = qemu_allocate_irq_orphan(ppce500_power_off, NULL, 0);
+ poweroff_irq = qemu_allocate_irq(OBJECT(machine), "poweroff",
+ ppce500_power_off, NULL, 0);
qdev_connect_gpio_out(dev, 0, poweroff_irq);
}
diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
index e89defb321..a13d633f64 100644
--- a/hw/ppc/pnv_lpc.c
+++ b/hw/ppc/pnv_lpc.c
@@ -993,7 +993,7 @@ ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **errp)
}
/* POWER has a 17th irq, QEMU only implements the 16 regular device irqs */
- irqs = qemu_allocate_irqs_orphan(handler, lpc, ISA_NUM_IRQS);
+ irqs = qemu_allocate_irqs(OBJECT(lpc), "isa-irq", handler, lpc, ISA_NUM_IRQS);
isa_bus_register_input_irqs(isa_bus, irqs);
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index 1ff33596ac..1f2148a4d3 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -509,7 +509,8 @@ static void pnv_psi_power8_realize(DeviceState *dev, Error **errp)
qdev_init_gpio_in(dev, pnv_psi_power8_set_irq, ics->nr_irqs);
- psi->qirqs = qemu_allocate_irqs_orphan(ics_set_irq, ics, ics->nr_irqs);
+ psi->qirqs = qemu_allocate_irqs(OBJECT(dev), "psi-irq",
+ ics_set_irq, ics, ics->nr_irqs);
/* XSCOM region for PSI registers */
pnv_xscom_region_init(&psi->xscom_regs, OBJECT(dev), &pnv_psi_xscom_ops,
@@ -872,7 +873,8 @@ static void pnv_psi_power9_realize(DeviceState *dev, Error **errp)
xive_source_irq_set_lsi(xsrc, i);
}
- psi->qirqs = qemu_allocate_irqs_orphan(xive_source_set_irq, xsrc, xsrc->nr_irqs);
+ psi->qirqs = qemu_allocate_irqs(OBJECT(dev), "psi-irq",
+ xive_source_set_irq, xsrc, xsrc->nr_irqs);
qdev_init_gpio_in(dev, pnv_psi_power9_set_irq, xsrc->nr_irqs);
diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
index a05edb78bc..82869ea03a 100644
--- a/hw/ppc/spapr_irq.c
+++ b/hw/ppc/spapr_irq.c
@@ -339,7 +339,7 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
spapr_xive_hcall_init(spapr);
}
- spapr->qirqs = qemu_allocate_irqs_orphan(spapr_set_irq, spapr,
+ spapr->qirqs = qemu_allocate_irqs(OBJECT(spapr), "irq", spapr_set_irq, spapr,
SPAPR_NR_XIRQS + SPAPR_IRQ_NR_IPIS);
/*
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index 3df9fafb12..3f4a9b9b7b 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -484,7 +484,8 @@ static void sifive_u_machine_init(MachineState *machine)
/* register gpio-restart */
qdev_connect_gpio_out(DEVICE(&(s->soc.gpio)), 10,
- qemu_allocate_irq_orphan(sifive_u_machine_reset, NULL, 0));
+ qemu_allocate_irq(OBJECT(machine), "reset-irq",
+ sifive_u_machine_reset, NULL, 0));
/* load/create device tree */
if (machine->dtb) {
diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
index 4c02b23a28..bfc61b8f3b 100644
--- a/hw/scsi/esp-pci.c
+++ b/hw/scsi/esp-pci.c
@@ -407,7 +407,7 @@ static void esp_pci_scsi_realize(PCIDevice *dev, Error **errp)
"esp-io", 0x80);
pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &pci->io);
- s->irq = qemu_allocate_irq_orphan(esp_irq_handler, pci, 0);
+ s->irq = qemu_allocate_irq(OBJECT(s), "esp-irq", esp_irq_handler, pci, 0);
scsi_bus_init(&s->bus, sizeof(s->bus), d, &esp_pci_scsi_info);
}
diff --git a/hw/sh4/sh7750.c b/hw/sh4/sh7750.c
index 307daa523d..a42b753a1d 100644
--- a/hw/sh4/sh7750.c
+++ b/hw/sh4/sh7750.c
@@ -848,5 +848,5 @@ SH7750State *sh7750_init(Object *parent, SuperHCPU *cpu,
qemu_irq sh7750_irl(SH7750State *s)
{
sh_intc_toggle_source(&s->intc.sources[IRL], 1, 0); /* enable */
- return qemu_allocate_irq_orphan(sh_intc_set_irl, &s->intc.sources[IRL], 0);
+ return qemu_allocate_irq(OBJECT(s), "irl", sh_intc_set_irl, &s->intc.sources[IRL], 0);
}
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 0a35b20e17..51f5468a02 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -1008,7 +1008,8 @@ static void sun4m_hw_init(MachineState *machine)
if (hwdef->apc_base) {
apc_init(OBJECT(machine), hwdef->apc_base,
- qemu_allocate_irq_orphan(cpu_halt_signal, NULL, 0));
+ qemu_allocate_irq(OBJECT(machine), "cpu-halt",
+ cpu_halt_signal, NULL, 0));
}
if (hwdef->fd_base) {
@@ -1018,7 +1019,7 @@ static void sun4m_hw_init(MachineState *machine)
sun4m_fdctrl_init(OBJECT(machine), slavio_irq[22], hwdef->fd_base, fd,
&fdc_tc);
} else {
- fdc_tc = qemu_allocate_irq_orphan(dummy_fdc_tc, NULL, 0);
+ fdc_tc = qemu_allocate_irq(OBJECT(machine), "fdc-tc", dummy_fdc_tc, NULL, 0);
}
slavio_misc_init(OBJECT(machine), hwdef->slavio_base, hwdef->aux1_base,
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 389436fd3d..7d84dc201f 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -311,7 +311,8 @@ static void ebus_realize(PCIDevice *pci_dev, Error **errp)
}
/* ISA bus */
- s->isa_irqs_in = qemu_allocate_irqs_orphan(ebus_isa_irq_handler, s, ISA_NUM_IRQS);
+ s->isa_irqs_in = qemu_allocate_irqs(OBJECT(s), "isa-irq-in",
+ ebus_isa_irq_handler, s, ISA_NUM_IRQS);
isa_bus_register_input_irqs(s->isa_bus, s->isa_irqs_in);
qdev_init_gpio_out_named(DEVICE(s), s->isa_irqs_out, "isa-irq",
ISA_NUM_IRQS);
diff --git a/hw/xen/xen-pvh-common.c b/hw/xen/xen-pvh-common.c
index 42514a599e..76893c8fcf 100644
--- a/hw/xen/xen-pvh-common.c
+++ b/hw/xen/xen-pvh-common.c
@@ -170,7 +170,7 @@ static void xen_create_virtio_mmio_devices(XenPVHMachineState *s)
*/
for (i = s->cfg.virtio_mmio_num - 1; i >= 0; i--) {
hwaddr base = s->cfg.virtio_mmio.base + i * s->cfg.virtio_mmio.size;
- qemu_irq irq = qemu_allocate_irq_orphan(xen_set_irq, NULL,
+ qemu_irq irq = qemu_allocate_irq(OBJECT(s), "virtio-irq[*]", xen_set_irq, NULL,
s->cfg.virtio_mmio_irq_base + i);
sysbus_create_simple(OBJECT(s), "virtio-mmio[*]", "virtio-mmio",
@@ -260,7 +260,8 @@ static inline void xenpvh_gpex_init(XenPVHMachineState *s,
assert(xpc->set_pci_intx_irq);
for (i = 0; i < PCI_NUM_PINS; i++) {
- qemu_irq irq = qemu_allocate_irq_orphan(xpc->set_pci_intx_irq, s, i);
+ qemu_irq irq = qemu_allocate_irq(OBJECT(s), "pci-intx-irq[*]",
+ xpc->set_pci_intx_irq, s, i);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, irq);
gpex_set_irq_num(GPEX_HOST(dev), i, s->cfg.pci_intx_irq_base + i);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 115/134] hw/core: Parent GPIO input IRQs and embedded IRQState via QOM
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (113 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 114/134] hw: " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 116/134] irq: Delete the *_orphan() IRQ allocation variants Alexander Graf
` (19 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
qdev_init_gpio_in_named_with_opaque() now uses qemu_extend_irqs()
directly, so the input IRQ objects are parented under the device via
object_new_child() and the manual object_property_add_child() loop
goes away. device_finalize() no longer needs to free the IRQ objects
explicitly since child<> property destruction does that; only the
qemu_irq* array itself needs g_free().
Convert the six users of qemu_init_irq()/qemu_init_irqs() (which
initialize an IRQState embedded in a device struct) to
qemu_init_irq_child() so those IRQs also get a QOM parent.
qdev_connect_gpio_out_named() now asserts that its input pin has a
parent instead of falling back to /machine/unattached; every
qemu_irq that reaches it is parented after this and the preceding
commits.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/core/gpio.c | 24 ++++--------------------
hw/core/qdev.c | 3 ++-
hw/ipack/ipack.c | 11 +++++++++--
hw/isa/vt82c686.c | 3 ++-
hw/net/imx_fec.c | 2 +-
hw/net/lan9118.c | 2 +-
hw/ppc/pegasos.c | 3 ++-
hw/sh4/r2d.c | 5 ++++-
8 files changed, 25 insertions(+), 28 deletions(-)
diff --git a/hw/core/gpio.c b/hw/core/gpio.c
index ef8ef8f25a..f76d604520 100644
--- a/hw/core/gpio.c
+++ b/hw/core/gpio.c
@@ -45,24 +45,12 @@ void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
void *opaque,
const char *name, int n)
{
- int i;
NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
assert(gpio_list->num_out == 0 || !name);
- gpio_list->in = qemu_extend_irqs_orphan(gpio_list->in, gpio_list->num_in, handler,
- opaque, n);
-
- if (!name) {
- name = "unnamed-gpio-in";
- }
- for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
- gchar *propname = g_strdup_printf("%s[%u]", name, i);
-
- object_property_add_child(OBJECT(dev), propname,
- OBJECT(gpio_list->in[i]));
- g_free(propname);
- }
-
+ gpio_list->in = qemu_extend_irqs(OBJECT(dev), name ?: "unnamed-gpio-in",
+ gpio_list->in, gpio_list->num_in,
+ handler, opaque, n);
gpio_list->num_in += n;
}
@@ -119,11 +107,7 @@ void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
{
char *propname = g_strdup_printf("%s[%d]",
name ? name : "unnamed-gpio-out", n);
- if (input_pin && !OBJECT(input_pin)->parent) {
- /* We need a name for object_property_set_link to work */
- object_property_add_child(machine_get_container("unattached"),
- "non-qdev-gpio[*]", OBJECT(input_pin));
- }
+ g_assert(!input_pin || OBJECT(input_pin)->parent);
object_property_set_link(OBJECT(dev), propname,
OBJECT(input_pin), &error_abort);
g_free(propname);
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index f7b512eb35..44a44862fd 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -697,7 +697,8 @@ static void device_finalize(Object *obj)
QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
QLIST_REMOVE(ngl, node);
- qemu_free_irqs(ngl->in, ngl->num_in);
+ /* IRQs are child<> properties of dev; freed via child destruction */
+ g_free(ngl->in);
g_free(ngl->name);
g_free(ngl);
/* ngl->out irqs are owned by the other end and should not be freed
diff --git a/hw/ipack/ipack.c b/hw/ipack/ipack.c
index f2e5524fa8..dad0d486df 100644
--- a/hw/ipack/ipack.c
+++ b/hw/ipack/ipack.c
@@ -55,18 +55,25 @@ static void ipack_device_realize(DeviceState *dev, Error **errp)
}
bus->free_slot = idev->slot + 1;
- qemu_init_irqs(idev->irq, ARRAY_SIZE(idev->irq), bus->set_irq, idev);
+ for (int i = 0; i < ARRAY_SIZE(idev->irq); i++) {
+ qemu_init_irq_child(OBJECT(idev), "irq[*]", &idev->irq[i],
+ bus->set_irq, idev, i);
+ }
k->realize(dev, errp);
}
static void ipack_device_unrealize(DeviceState *dev)
{
+ IPackDevice *idev = IPACK_DEVICE(dev);
IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(dev);
if (k->unrealize) {
k->unrealize(dev);
- return;
+ }
+
+ for (int i = 0; i < ARRAY_SIZE(idev->irq); i++) {
+ object_unparent(OBJECT(&idev->irq[i]));
}
}
diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c
index 2337c3115b..f93bf49754 100644
--- a/hw/isa/vt82c686.c
+++ b/hw/isa/vt82c686.c
@@ -722,7 +722,8 @@ static void via_isa_realize(PCIDevice *d, Error **errp)
qdev_init_gpio_out_named(dev, &s->cpu_intr, "intr", 1);
qdev_init_gpio_in_named(dev, via_isa_pirq, "pirq", PCI_NUM_PINS);
- qemu_init_irq(&s->i8259_irq, via_isa_request_i8259_irq, s, 0);
+ qemu_init_irq_child(OBJECT(s), "i8259-irq", &s->i8259_irq,
+ via_isa_request_i8259_irq, s, 0);
isa_bus = isa_bus_new(dev, pci_address_space(d), pci_address_space_io(d),
errp);
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
index c177b7ff2b..38e0f64462 100644
--- a/hw/net/imx_fec.c
+++ b/hw/net/imx_fec.c
@@ -1205,7 +1205,7 @@ static void imx_eth_realize(DeviceState *dev, Error **errp)
sysbus_init_irq(sbd, &s->irq[0]);
sysbus_init_irq(sbd, &s->irq[1]);
- qemu_init_irq(&s->mii_irq, imx_phy_update_irq, s, 0);
+ qemu_init_irq_child(OBJECT(s), "mii-irq", &s->mii_irq, imx_phy_update_irq, s, 0);
object_initialize_child(OBJECT(s), "mii", &s->mii, TYPE_LAN9118_PHY);
if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(&s->mii), errp)) {
return;
diff --git a/hw/net/lan9118.c b/hw/net/lan9118.c
index 91c3533702..2003280fc4 100644
--- a/hw/net/lan9118.c
+++ b/hw/net/lan9118.c
@@ -1274,7 +1274,7 @@ static void lan9118_realize(DeviceState *dev, Error **errp)
const MemoryRegionOps *mem_ops =
s->mode_16bit ? &lan9118_16bit_mem_ops : &lan9118_mem_ops;
- qemu_init_irq(&s->mii_irq, lan9118_update_irq, s, 0);
+ qemu_init_irq_child(OBJECT(s), "mii-irq", &s->mii_irq, lan9118_update_irq, s, 0);
object_initialize_child(OBJECT(s), "mii", &s->mii, TYPE_LAN9118_PHY);
if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(&s->mii), errp)) {
return;
diff --git a/hw/ppc/pegasos.c b/hw/ppc/pegasos.c
index 426a54d8ee..845b6355e9 100644
--- a/hw/ppc/pegasos.c
+++ b/hw/ppc/pegasos.c
@@ -134,7 +134,8 @@ static void pegasos2_setup_pci_irq(PegasosMachineState *pm)
TYPE_OR_IRQ, &error_fatal,
"num-lines", "2", NULL);
qdev_realize(DEVICE(ori), NULL, &error_fatal);
- qemu_init_irq(&pm->pci_irqs[i], pegasos2_pci_irq, pm, i);
+ qemu_init_irq_child(OBJECT(pm), "pci-irq[*]", &pm->pci_irqs[i],
+ pegasos2_pci_irq, pm, i);
qdev_connect_gpio_out(DEVICE(ori), 0, &pm->pci_irqs[i]);
pm->mv_pirq[i] = qdev_get_gpio_in_named(pm->nb, "gpp", 12 + i);
pm->via_pirq[i] = qdev_get_gpio_in_named(pm->sb, "pirq", i);
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index 8deda6e5f4..21e804f3d9 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -200,7 +200,10 @@ static r2d_fpga_t *r2d_fpga_init(Object *owner,
memory_region_init_io(&s->iomem, owner, &r2d_fpga_ops, s, "r2d-fpga", 0x40);
memory_region_add_subregion(sysmem, base, &s->iomem);
- qemu_init_irqs(s->irq, NR_IRQS, r2d_fpga_irq_set, s);
+ for (int i = 0; i < NR_IRQS; i++) {
+ qemu_init_irq_child(owner, "fpga-irq[*]", &s->irq[i],
+ r2d_fpga_irq_set, s, i);
+ }
return s;
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 116/134] irq: Delete the *_orphan() IRQ allocation variants
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (114 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 115/134] hw/core: Parent GPIO input IRQs and embedded IRQState via QOM Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 117/134] sysbus: Parent main-system-bus directly under /machine Alexander Graf
` (18 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Every caller has been converted to the parented form; drop the
transitional *_orphan() helpers.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/core/irq.c | 35 -----------------------------------
include/hw/core/irq.h | 20 +-------------------
2 files changed, 1 insertion(+), 54 deletions(-)
diff --git a/hw/core/irq.c b/hw/core/irq.c
index ee954eaf62..a93c64e6ae 100644
--- a/hw/core/irq.c
+++ b/hw/core/irq.c
@@ -68,34 +68,6 @@ void qemu_init_irqs(IRQState irq[], size_t count,
}
}
-qemu_irq *qemu_extend_irqs_orphan(qemu_irq *old, int n_old, qemu_irq_handler handler,
- void *opaque, int n)
-{
- qemu_irq *s;
- int i;
-
- if (!old) {
- n_old = 0;
- }
- s = old ? g_renew(qemu_irq, old, n + n_old) : g_new(qemu_irq, n);
- for (i = n_old; i < n + n_old; i++) {
- s[i] = qemu_allocate_irq_orphan(handler, opaque, i);
- }
- return s;
-}
-
-qemu_irq *qemu_allocate_irqs_orphan(qemu_irq_handler handler, void *opaque, int n)
-{
- return qemu_extend_irqs_orphan(NULL, 0, handler, opaque, n);
-}
-
-qemu_irq qemu_allocate_irq_orphan(qemu_irq_handler handler, void *opaque, int n)
-{
- IRQState *irq = IRQ(object_new(TYPE_IRQ));
- init_irq_fields(irq, handler, opaque, n);
- return irq;
-}
-
qemu_irq qemu_allocate_irq(Object *owner, const char *name,
qemu_irq_handler handler, void *opaque, int n)
{
@@ -153,13 +125,6 @@ static void qemu_notirq(void *opaque, int line, int level)
qemu_set_irq(irq, !level);
}
-qemu_irq qemu_irq_invert_orphan(qemu_irq irq)
-{
- /* The default state for IRQs is low, so raise the output now. */
- qemu_irq_raise(irq);
- return qemu_allocate_irq_orphan(qemu_notirq, irq, 0);
-}
-
qemu_irq qemu_irq_invert(Object *owner, const char *name, qemu_irq irq)
{
/* The default state for IRQs is low, so raise the output now. */
diff --git a/include/hw/core/irq.h b/include/hw/core/irq.h
index 5ccccd2697..89923cf4a8 100644
--- a/include/hw/core/irq.h
+++ b/include/hw/core/irq.h
@@ -74,19 +74,8 @@ void qemu_init_irq_child(Object *parent, const char *propname,
void qemu_init_irqs(IRQState irq[], size_t count,
qemu_irq_handler handler, void *opaque);
-/* Returns an array of N IRQs. Each IRQ is assigned the argument handler and
- * opaque data.
- */
-qemu_irq *qemu_allocate_irqs_orphan(qemu_irq_handler handler, void *opaque, int n);
-
/*
- * Allocates a single IRQ. The irq is assigned with a handler, an opaque
- * data and the interrupt number.
- */
-qemu_irq qemu_allocate_irq_orphan(qemu_irq_handler handler, void *opaque, int n);
-
-/*
- * Same as the *_orphan() variants above, but the new IRQ objects are
+ * Allocate IRQ objects with an explicit QOM parent. The new objects are
* parented under @owner with property name @name (or @name[*] for the
* array/extend variants). The reference is held by @owner; call
* qemu_free_irq() to unparent and free.
@@ -99,17 +88,10 @@ qemu_irq *qemu_extend_irqs(Object *owner, const char *name,
qemu_irq *old, int n_old,
qemu_irq_handler handler, void *opaque, int n);
-/* Extends an Array of IRQs. Old IRQs have their handlers and opaque data
- * preserved. New IRQs are assigned the argument handler and opaque data.
- */
-qemu_irq *qemu_extend_irqs_orphan(qemu_irq *old, int n_old, qemu_irq_handler handler,
- void *opaque, int n);
-
void qemu_free_irqs(qemu_irq *s, int n);
void qemu_free_irq(qemu_irq irq);
/* Returns a new IRQ with opposite polarity. */
-qemu_irq qemu_irq_invert_orphan(qemu_irq irq);
qemu_irq qemu_irq_invert(Object *owner, const char *name, qemu_irq irq);
/* For internal use in qtest. */
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 117/134] sysbus: Parent main-system-bus directly under /machine
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (115 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 116/134] irq: Delete the *_orphan() IRQ allocation variants Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 118/134] accel: Parent the accelerator singleton " Alexander Graf
` (17 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
The main system bus is the only object deliberately placed under
/machine/unattached; every other resident is an accidental orphan.
Promoting it to /machine/sysbus makes /machine/unattached a pure
bug indicator that later commits can turn into a hard error.
The canonical path changes from /machine/unattached/sysbus to
/machine/sysbus. qom-list users that hard-code the old path need
to be updated; the hmp/qmp qom-tree output naturally follows.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
system/vl.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/system/vl.c b/system/vl.c
index 061cbdf860..b4434839df 100644
--- a/system/vl.c
+++ b/system/vl.c
@@ -2211,7 +2211,7 @@ static void qemu_create_machine(QDict *qdict)
object_property_add_child(object_get_root(), "machine",
OBJECT(current_machine));
qemu_create_machine_containers(OBJECT(current_machine));
- object_property_add_child(machine_get_container("unattached"),
+ object_property_add_child(OBJECT(current_machine),
"sysbus", OBJECT(sysbus_get_default()));
if (machine_class->minimum_page_bits) {
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 118/134] accel: Parent the accelerator singleton under /machine
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (116 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 117/134] sysbus: Parent main-system-bus directly under /machine Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 119/134] hw/core/reset: Give the root reset container and legacy shims a QOM path Alexander Graf
` (16 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
do_configure_accelerator() runs after qemu_create_machine(), so
current_machine is available. Give the AccelState singleton a
canonical path at /machine/accel and drop the floating caller
reference; on init failure, unparent instead of unref.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
accel/accel-system.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/accel/accel-system.c b/accel/accel-system.c
index 9176665202..987c982c16 100644
--- a/accel/accel-system.c
+++ b/accel/accel-system.c
@@ -41,12 +41,14 @@ int accel_init_machine(AccelState *accel, MachineState *ms)
AccelClass *acc = ACCEL_GET_CLASS(accel);
int ret;
ms->accelerator = accel;
+ object_property_add_child(OBJECT(ms), "accel", OBJECT(accel));
+ object_unref(OBJECT(accel));
*(acc->allowed) = true;
ret = acc->init_machine(accel, ms);
if (ret < 0) {
ms->accelerator = NULL;
*(acc->allowed) = false;
- object_unref(OBJECT(accel));
+ object_unparent(OBJECT(accel));
} else {
object_set_accelerator_compat_props(acc->compat_props);
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 119/134] hw/core/reset: Give the root reset container and legacy shims a QOM path
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (117 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 118/134] accel: Parent the accelerator singleton " Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 120/134] system: Parent per-MR helper objects under their owner Alexander Graf
` (15 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
The root ResettableContainer and the LegacyReset shim objects are
long-lived singletons held only by static pointers and refcounts.
Give them a canonical path in the composition tree so
qom-tree/qom-list can enumerate them and so device_set_realized()
can require a QOM parent for every object.
/machine/reset-container (ResettableContainer)
/machine/reset-container/legacy-reset[N] (LegacyReset shims)
get_root_reset_container() is first reached from configure_accelerators()
or machine_run_board_init(), both of which run after qemu_create_machine(),
so qdev_get_machine() is available. qemu_unregister_reset() switches
from object_unref() to object_unparent() to release the child<> ref.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/core/reset.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/hw/core/reset.c b/hw/core/reset.c
index e7230b49b7..34c1ab84d9 100644
--- a/hw/core/reset.c
+++ b/hw/core/reset.c
@@ -27,6 +27,7 @@
#include "system/reset.h"
#include "hw/core/resettable.h"
#include "hw/core/resetcontainer.h"
+#include "hw/core/qdev.h"
/*
* Return a pointer to the singleton container that holds all the Resettable
@@ -38,7 +39,9 @@ static ResettableContainer *get_root_reset_container(void)
if (!root_reset_container) {
root_reset_container =
- RESETTABLE_CONTAINER(object_new(TYPE_RESETTABLE_CONTAINER));
+ RESETTABLE_CONTAINER(object_new_child(qdev_get_machine(),
+ "reset-container",
+ TYPE_RESETTABLE_CONTAINER));
}
return root_reset_container;
}
@@ -94,7 +97,8 @@ static void legacy_reset_class_init(ObjectClass *klass, const void *data)
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
{
- Object *obj = object_new(TYPE_LEGACY_RESET);
+ Object *obj = object_new_child(OBJECT(get_root_reset_container()),
+ "legacy-reset[*]", TYPE_LEGACY_RESET);
LegacyReset *lr = LEGACY_RESET(obj);
lr->func = func;
@@ -104,7 +108,8 @@ void qemu_register_reset(QEMUResetHandler *func, void *opaque)
void qemu_register_reset_nosnapshotload(QEMUResetHandler *func, void *opaque)
{
- Object *obj = object_new(TYPE_LEGACY_RESET);
+ Object *obj = object_new_child(OBJECT(get_root_reset_container()),
+ "legacy-reset[*]", TYPE_LEGACY_RESET);
LegacyReset *lr = LEGACY_RESET(obj);
lr->func = func;
@@ -156,7 +161,7 @@ void qemu_unregister_reset(QEMUResetHandler *func, void *opaque)
if (obj) {
qemu_unregister_resettable(obj);
- object_unref(obj);
+ object_unparent(obj);
}
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 120/134] system: Parent per-MR helper objects under their owner
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (118 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 119/134] hw/core/reset: Give the root reset container and legacy shims a QOM path Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 121/134] hw/virtio, hw/display: Parent per-device helper objects Alexander Graf
` (14 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
RamBlockAttributes and MemoryRegionPortioList objects are long-lived
helpers whose lifetime is already tied to a MemoryRegion or its owner.
Give each a canonical path under that owner instead of leaving them
as floating refcounted objects:
<mr-path>/attributes (RamBlockAttributes)
<owner-path>/portio-list[N] (MemoryRegionPortioList)
The destroy paths switch from object_unref() to object_unparent()
now that the parent holds the reference.
RamDiscardManager is deliberately left as-is: it is unref'd from
memory_region_finalize() itself, so making it a child<> of the MR
would introduce a use-after-free during MR teardown. It can move
under a different owner in a follow-up once the RDM lifecycle is
untangled from MR finalize.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
system/ioport.c | 5 +++--
system/ram-block-attributes.c | 7 ++++---
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/system/ioport.c b/system/ioport.c
index 0415b3cd60..77ab77d7be 100644
--- a/system/ioport.c
+++ b/system/ioport.c
@@ -145,7 +145,7 @@ void portio_list_destroy(PortioList *piolist)
for (i = 0; i < piolist->nr; ++i) {
mrpio = container_of(piolist->regions[i], MemoryRegionPortioList, mr);
object_unparent(OBJECT(&mrpio->mr));
- object_unref(mrpio);
+ object_unparent(OBJECT(mrpio));
}
g_free(piolist->regions);
}
@@ -228,7 +228,8 @@ static void portio_list_add_1(PortioList *piolist,
/* Copy the sub-list and null-terminate it. */
mrpio = MEMORY_REGION_PORTIO_LIST(
- object_new(TYPE_MEMORY_REGION_PORTIO_LIST));
+ object_new_child(piolist->owner, "portio-list[*]",
+ TYPE_MEMORY_REGION_PORTIO_LIST));
mrpio->portio_opaque = piolist->opaque;
mrpio->ports = g_new0(MemoryRegionPortio, count + 1);
memcpy(mrpio->ports, pio_init, sizeof(MemoryRegionPortio) * count);
diff --git a/system/ram-block-attributes.c b/system/ram-block-attributes.c
index 59ec7a28eb..0967bed6d3 100644
--- a/system/ram-block-attributes.c
+++ b/system/ram-block-attributes.c
@@ -182,12 +182,13 @@ RamBlockAttributes *ram_block_attributes_create(RAMBlock *ram_block)
RamBlockAttributes *attr;
MemoryRegion *mr = ram_block->mr;
- attr = RAM_BLOCK_ATTRIBUTES(object_new(TYPE_RAM_BLOCK_ATTRIBUTES));
+ attr = RAM_BLOCK_ATTRIBUTES(object_new_child(OBJECT(mr), "attributes",
+ TYPE_RAM_BLOCK_ATTRIBUTES));
attr->ram_block = ram_block;
if (memory_region_add_ram_discard_source(mr, RAM_DISCARD_SOURCE(attr))) {
- object_unref(OBJECT(attr));
+ object_unparent(OBJECT(attr));
return NULL;
}
attr->bitmap_size = DIV_ROUND_UP(int128_get64(mr->size), block_size);
@@ -202,7 +203,7 @@ void ram_block_attributes_destroy(RamBlockAttributes *attr)
g_free(attr->bitmap);
memory_region_del_ram_discard_source(attr->ram_block->mr, RAM_DISCARD_SOURCE(attr));
- object_unref(OBJECT(attr));
+ object_unparent(OBJECT(attr));
}
static void ram_block_attributes_init(Object *obj)
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 121/134] hw/virtio, hw/display: Parent per-device helper objects
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (119 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 120/134] system: Parent per-MR helper objects under their owner Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 122/134] hw/i386/amd_iommu: Parent internally-created AMDVI-PCI under the IOMMU Alexander Graf
` (13 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
The virtio-mem system-reset shim, the vhost-user-gpu backend, and
its socket chardev live exactly as long as their enclosing virtio
device. Parent them under it so they show up in the composition
tree instead of floating with only a refcount.
The unrealize/finalize/error paths switch from object_unref() to
object_unparent(), and vhost_user_gpu_instance_finalize() drops its
now-redundant unref: the vhost-backend is a child<> of the GPU and
is released automatically when the GPU is finalized.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/display/vhost-user-gpu.c | 12 ++++++------
hw/virtio/virtio-mem.c | 5 +++--
2 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c
index 57360898ca..c2c150bdcf 100644
--- a/hw/display/vhost-user-gpu.c
+++ b/hw/display/vhost-user-gpu.c
@@ -439,7 +439,8 @@ vhost_user_gpu_do_set_socket(VhostUserGPU *g, Error **errp)
return false;
}
- chr = CHARDEV(object_new(TYPE_CHARDEV_SOCKET));
+ chr = CHARDEV(object_new_child(OBJECT(g), "vhost-chardev",
+ TYPE_CHARDEV_SOCKET));
if (!chr || qemu_chr_add_client(chr, sv[0]) == -1) {
error_setg(errp, "Failed to make socket chardev");
goto err;
@@ -462,7 +463,7 @@ err:
close(sv[0]);
close(sv[1]);
if (chr) {
- object_unref(OBJECT(chr));
+ object_unparent(OBJECT(chr));
}
return false;
}
@@ -584,7 +585,8 @@ vhost_user_gpu_instance_init(Object *obj)
{
VhostUserGPU *g = VHOST_USER_GPU(obj);
- g->vhost = VHOST_USER_BACKEND(object_new(TYPE_VHOST_USER_BACKEND));
+ g->vhost = VHOST_USER_BACKEND(object_new_child(obj, "vhost-backend",
+ TYPE_VHOST_USER_BACKEND));
object_property_add_alias(obj, "chardev",
OBJECT(g->vhost), "chardev");
}
@@ -592,9 +594,7 @@ vhost_user_gpu_instance_init(Object *obj)
static void
vhost_user_gpu_instance_finalize(Object *obj)
{
- VhostUserGPU *g = VHOST_USER_GPU(obj);
-
- object_unref(OBJECT(g->vhost));
+ /* g->vhost is a child<> of obj and released with it */
}
static void
diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
index 35e03ed759..c45cbdbe32 100644
--- a/hw/virtio/virtio-mem.c
+++ b/hw/virtio/virtio-mem.c
@@ -1011,7 +1011,8 @@ static void virtio_mem_device_realize(DeviceState *dev, Error **errp)
* we need a dedicated reset object that only gets called during
* qemu_devices_reset().
*/
- obj = object_new(TYPE_VIRTIO_MEM_SYSTEM_RESET);
+ obj = object_new_child(OBJECT(vmem), "system-reset",
+ TYPE_VIRTIO_MEM_SYSTEM_RESET);
vmem->system_reset = VIRTIO_MEM_SYSTEM_RESET(obj);
vmem->system_reset->vmem = vmem;
qemu_register_resettable(obj);
@@ -1023,7 +1024,7 @@ static void virtio_mem_device_unrealize(DeviceState *dev)
VirtIOMEM *vmem = VIRTIO_MEM(dev);
qemu_unregister_resettable(OBJECT(vmem->system_reset));
- object_unref(OBJECT(vmem->system_reset));
+ object_unparent(OBJECT(vmem->system_reset));
if (vmem->early_migration) {
vmstate_unregister(VMSTATE_IF(vmem), &vmstate_virtio_mem_device_early,
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 122/134] hw/i386/amd_iommu: Parent internally-created AMDVI-PCI under the IOMMU
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (120 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 121/134] hw/virtio, hw/display: Parent per-device helper objects Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 123/134] hw/s390x, hw/remote: Parent per-devfn IOMMU objects Alexander Graf
` (12 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
When the AMD IOMMU creates its own PCI companion device (no pci-id
supplied by the user), parent it under the sysbus IOMMU so it has a
canonical path at <iommu>/pci. The user-supplied path already
parents via -device.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/i386/amd_iommu.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
index 90252c52af..e3394bad6e 100644
--- a/hw/i386/amd_iommu.c
+++ b/hw/i386/amd_iommu.c
@@ -2698,7 +2698,8 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
s->pci = AMD_IOMMU_PCI(pdev);
dc->vmsd = &vmstate_amdvi_sysbus_migratable;
} else {
- s->pci = AMD_IOMMU_PCI(object_new(TYPE_AMD_IOMMU_PCI));
+ s->pci = AMD_IOMMU_PCI(object_new_child(OBJECT(s), "pci",
+ TYPE_AMD_IOMMU_PCI));
/* This device should take care of IOMMU PCI properties */
if (!qdev_realize(DEVICE(s->pci), &bus->qbus, errp)) {
return;
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 123/134] hw/s390x, hw/remote: Parent per-devfn IOMMU objects
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (121 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 122/134] hw/i386/amd_iommu: Parent internally-created AMDVI-PCI under the IOMMU Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 124/134] hw/pci-host/raven: Parent the OR-IRQ under the host bridge Alexander Graf
` (11 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Give the per-devfn S390 PCI IOMMU object a canonical path under the
S390 PCI host state. s390_pci_iommu_free() already calls
object_unparent(), which was previously a no-op; it now performs
the actual release.
For the multi-process remote IOMMU, replace the raw
object_new(TYPE_MEMORY_REGION) with a proper memory_region_init()
under the RemoteIommu object so the MR gets an owner like every
other MR in the tree.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/remote/iommu.c | 5 +++--
hw/s390x/s390-pci-bus.c | 8 +++++++-
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/hw/remote/iommu.c b/hw/remote/iommu.c
index 3e0758a21e..09f79e805c 100644
--- a/hw/remote/iommu.c
+++ b/hw/remote/iommu.c
@@ -52,8 +52,9 @@ static AddressSpace *remote_iommu_find_add_as(PCIBus *pci_bus,
}
if (!elem->mr) {
- elem->mr = MEMORY_REGION(object_new(TYPE_MEMORY_REGION));
- memory_region_set_size(elem->mr, UINT64_MAX);
+ g_autofree char *name = g_strdup_printf("mr-devfn-%02x", devfn);
+ elem->mr = g_new0(MemoryRegion, 1);
+ memory_region_init(elem->mr, OBJECT(iommu), name, UINT64_MAX);
address_space_init(&elem->as, elem->mr, NULL);
}
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 4f0a8a787b..557ecbb977 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -618,7 +618,13 @@ static S390PCIIOMMU *s390_pci_get_iommu(S390pciState *s, PCIBus *bus,
iommu = table->iommu[PCI_SLOT(devfn)];
if (!iommu) {
- iommu = S390_PCI_IOMMU(object_new(TYPE_S390_PCI_IOMMU));
+ char *ch_name = g_strdup_printf("iommu[%02x:%02x.%01x]",
+ pci_bus_num(bus),
+ PCI_SLOT(devfn),
+ PCI_FUNC(devfn));
+ iommu = S390_PCI_IOMMU(object_new_child(OBJECT(s), ch_name,
+ TYPE_S390_PCI_IOMMU));
+ g_free(ch_name);
char *mr_name = g_strdup_printf("iommu-root-%02x:%02x.%01x",
pci_bus_num(bus),
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 124/134] hw/pci-host/raven: Parent the OR-IRQ under the host bridge
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (122 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 123/134] hw/s390x, hw/remote: Parent per-devfn IOMMU objects Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 125/134] hw/arm/mps2: Parent the OR-IRQ gates under the machine Alexander Graf
` (10 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
The PReP raven host bridge creates an or-irq gate to fan PCI
interrupts into IRQ 15. Parent it under the host bridge so it
gets a canonical path.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/pci-host/raven.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/pci-host/raven.c b/hw/pci-host/raven.c
index b6ab686ff5..62d78efde5 100644
--- a/hw/pci-host/raven.c
+++ b/hw/pci-host/raven.c
@@ -249,7 +249,8 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)
* According to PReP specification section 6.1.6 "System Interrupt
* Assignments", all PCI interrupts are routed via IRQ 15
*/
- s->or_irq = OR_IRQ(object_new(TYPE_OR_IRQ));
+ s->or_irq = OR_IRQ(object_new_child(OBJECT(s), "or-irq",
+ TYPE_OR_IRQ));
object_property_set_int(OBJECT(s->or_irq), "num-lines", PCI_NUM_PINS,
&error_fatal);
qdev_realize(DEVICE(s->or_irq), NULL, &error_fatal);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 125/134] hw/arm/mps2: Parent the OR-IRQ gates under the machine
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (123 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 124/134] hw/pci-host/raven: Parent the OR-IRQ under the host bridge Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:36 ` [RFC PATCH 126/134] hw/arm/digic: Parent the DIGIC SoC " Alexander Graf
` (9 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
The mps2 board creates several TYPE_OR_IRQ gates for UART overflow,
per-UART tx/rx, and SPI interrupts. Parent them under the machine
so they get canonical paths. The 282/325 pair sit on
mutually-exclusive switch arms, so a single "uart-orgate" name is
sufficient; the loop-created gates use "[*]" auto-indexing.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/mps2.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
index 1dec4a5d4d..1032f47cb8 100644
--- a/hw/arm/mps2.c
+++ b/hw/arm/mps2.c
@@ -279,7 +279,7 @@ static void mps2_common_init(MachineState *machine)
Object *orgate;
DeviceState *orgate_dev;
- orgate = object_new(TYPE_OR_IRQ);
+ orgate = object_new_child(OBJECT(mms), "uart-orgate", TYPE_OR_IRQ);
object_property_set_int(orgate, "num-lines", 6, &error_fatal);
qdev_realize(DEVICE(orgate), NULL, &error_fatal);
orgate_dev = DEVICE(orgate);
@@ -322,7 +322,7 @@ static void mps2_common_init(MachineState *machine)
Object *orgate;
DeviceState *orgate_dev;
- orgate = object_new(TYPE_OR_IRQ);
+ orgate = object_new_child(OBJECT(mms), "uart-orgate", TYPE_OR_IRQ);
object_property_set_int(orgate, "num-lines", 10, &error_fatal);
qdev_realize(DEVICE(orgate), NULL, &error_fatal);
orgate_dev = DEVICE(orgate);
@@ -338,7 +338,8 @@ static void mps2_common_init(MachineState *machine)
DeviceState *txrx_orgate_dev, *dev;
SysBusDevice *s;
- txrx_orgate = object_new(TYPE_OR_IRQ);
+ txrx_orgate = object_new_child(OBJECT(mms), "uart-txrx-orgate[*]",
+ TYPE_OR_IRQ);
object_property_set_int(txrx_orgate, "num-lines", 2, &error_fatal);
qdev_realize(DEVICE(txrx_orgate), NULL, &error_fatal);
txrx_orgate_dev = DEVICE(txrx_orgate);
@@ -430,7 +431,7 @@ static void mps2_common_init(MachineState *machine)
Object *orgate;
int j;
- orgate = object_new(TYPE_OR_IRQ);
+ orgate = object_new_child(OBJECT(mms), "spi-orgate[*]", TYPE_OR_IRQ);
object_property_set_int(orgate, "num-lines", 2, &error_fatal);
orgate_dev = DEVICE(orgate);
qdev_realize(orgate_dev, NULL, &error_fatal);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 126/134] hw/arm/digic: Parent the DIGIC SoC under the machine
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (124 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 125/134] hw/arm/mps2: Parent the OR-IRQ gates under the machine Alexander Graf
@ 2026-07-11 22:36 ` Alexander Graf
2026-07-11 22:37 ` [RFC PATCH 127/134] hw/microblaze: Parent the CPU " Alexander Graf
` (8 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:36 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Bring digic in line with cubieboard/orangepi/bpim2u/imx6ul/imx7,
which all parent their SoC as /machine/soc.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/digic_boards.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index 92b66f34f7..bdc5f7324b 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -50,7 +50,8 @@ typedef struct DigicBoard {
static void digic4_board_init(MachineState *machine, DigicBoard *board)
{
Error *err = NULL;
- DigicState *s = DIGIC(object_new(TYPE_DIGIC));
+ DigicState *s = DIGIC(object_new_child(OBJECT(machine), "soc",
+ TYPE_DIGIC));
MachineClass *mc = MACHINE_GET_CLASS(machine);
if (machine->ram_size != mc->default_ram_size) {
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 127/134] hw/microblaze: Parent the CPU under the machine
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (125 preceding siblings ...)
2026-07-11 22:36 ` [RFC PATCH 126/134] hw/arm/digic: Parent the DIGIC SoC " Alexander Graf
@ 2026-07-11 22:37 ` Alexander Graf
2026-07-11 22:37 ` [RFC PATCH 128/134] hw: Pair object_initialize_child() with plain realize() Alexander Graf
` (7 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:37 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Both petalogix boards create exactly one MicroBlaze CPU via
object_new(); parent it as /machine/cpu[0] like every other
single-CPU board.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/microblaze/petalogix_ml605_mmu.c | 3 ++-
hw/microblaze/petalogix_s3adsp1800_mmu.c | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index 26470b0251..cfc76bf518 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -82,7 +82,8 @@ petalogix_ml605_init(MachineState *machine)
qemu_irq irq[32];
/* init CPUs */
- cpu = MICROBLAZE_CPU(object_new(TYPE_MICROBLAZE_CPU));
+ cpu = MICROBLAZE_CPU(object_new_child(OBJECT(machine), "cpu[0]",
+ TYPE_MICROBLAZE_CPU));
object_property_set_str(OBJECT(cpu), "version", "8.10.a", &error_abort);
/* Use FPU but don't use floating point conversion and square
* root instructions
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index 83bf325b2b..82e486e716 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -85,7 +85,8 @@ petalogix_s3adsp1800_init(MachineState *machine)
MemoryRegion *sysmem = get_system_memory();
EndianMode endianness = psms->endianness;
- cpu = MICROBLAZE_CPU(object_new(TYPE_MICROBLAZE_CPU));
+ cpu = MICROBLAZE_CPU(object_new_child(OBJECT(machine), "cpu[0]",
+ TYPE_MICROBLAZE_CPU));
object_property_set_str(OBJECT(cpu), "version", "7.10.d", &error_abort);
object_property_set_bool(OBJECT(cpu), "little-endian",
endianness == ENDIAN_MODE_LITTLE, &error_abort);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 128/134] hw: Pair object_initialize_child() with plain realize()
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (126 preceding siblings ...)
2026-07-11 22:37 ` [RFC PATCH 127/134] hw/microblaze: Parent the CPU " Alexander Graf
@ 2026-07-11 22:37 ` Alexander Graf
2026-07-11 22:37 ` [RFC PATCH 129/134] hw: Parent board-created CPUs under the machine Alexander Graf
` (6 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:37 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
A number of composite devices and boards create embedded children
via object_initialize_child() (or object_new_with_props()) and
then realize them via *_realize_and_unref(). The child<> property
already holds the sole reference; the extra unref drops it and the
object survives only because bus_add_child() takes a reference of
its own. Use plain sysbus_realize()/qdev_realize() so the parent's
child<> keeps the reference it is documented to hold.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/imx8mm-evk.c | 2 +-
hw/arm/imx8mp-evk.c | 2 +-
hw/arm/mps2.c | 2 +-
hw/display/sm501.c | 2 +-
hw/m68k/q800.c | 6 +++---
hw/misc/macio/macio.c | 2 +-
hw/net/imx_fec.c | 2 +-
hw/net/lan9118.c | 2 +-
hw/nubus/nubus-virtio-mmio.c | 2 +-
hw/pci-host/mv64361.c | 2 +-
hw/xen/xen-pvh-common.c | 2 +-
11 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/hw/arm/imx8mm-evk.c b/hw/arm/imx8mm-evk.c
index 72fa1930ae..84a1ae6aa4 100644
--- a/hw/arm/imx8mm-evk.c
+++ b/hw/arm/imx8mm-evk.c
@@ -80,7 +80,7 @@ static void imx8mm_evk_init(MachineState *machine)
s = FSL_IMX8MM(object_new_with_props(TYPE_FSL_IMX8MM, OBJECT(machine),
"soc", &error_fatal, NULL));
object_property_set_uint(OBJECT(s), "fec1-phy-num", 1, &error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(s), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(s), &error_fatal);
memory_region_add_subregion(get_system_memory(), FSL_IMX8MM_RAM_START,
machine->ram);
diff --git a/hw/arm/imx8mp-evk.c b/hw/arm/imx8mp-evk.c
index 6116e6e9dc..776aa22b9a 100644
--- a/hw/arm/imx8mp-evk.c
+++ b/hw/arm/imx8mp-evk.c
@@ -93,7 +93,7 @@ static void imx8mp_evk_init(MachineState *machine)
object_property_set_link(OBJECT(&s->soc), bus_name,
OBJECT(s->canbus[i]), &error_fatal);
}
- sysbus_realize_and_unref(SYS_BUS_DEVICE(&s->soc), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(&s->soc), &error_fatal);
memory_region_add_subregion(get_system_memory(), FSL_IMX8MP_RAM_START,
machine->ram);
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
index 1032f47cb8..3de11b19a9 100644
--- a/hw/arm/mps2.c
+++ b/hw/arm/mps2.c
@@ -379,7 +379,7 @@ static void mps2_common_init(MachineState *machine)
TYPE_CMSDK_APB_TIMER);
sbd = SYS_BUS_DEVICE(&mms->timer[i]);
qdev_connect_clock_in(DEVICE(&mms->timer[i]), "pclk", mms->sysclk);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
sysbus_mmio_map(sbd, 0, base);
sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(armv7m, irqno));
}
diff --git a/hw/display/sm501.c b/hw/display/sm501.c
index 81c27c8f52..c7daf2c7ba 100644
--- a/hw/display/sm501.c
+++ b/hw/display/sm501.c
@@ -2045,7 +2045,7 @@ static void sm501_realize_sysbus(DeviceState *dev, Error **errp)
sysbus_init_mmio(sbd, &s->state.mmio_region);
/* bridge to usb host emulation module */
- sysbus_realize_and_unref(SYS_BUS_DEVICE(&s->ohci), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(&s->ohci), &error_fatal);
memory_region_add_subregion(&s->state.mmio_region, SM501_USB_HOST,
sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->ohci), 0));
sysbus_pass_irq(sbd, SYS_BUS_DEVICE(&s->ohci));
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 677dc4ad80..9fc186737b 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -324,14 +324,14 @@ static void q800_machine_init(MachineState *machine)
object_initialize_child(OBJECT(machine), "djmemc", &m->djmemc,
TYPE_DJMEMC);
sysbus = SYS_BUS_DEVICE(&m->djmemc);
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
memory_region_add_subregion(&m->macio, DJMEMC_BASE - IO_BASE,
sysbus_mmio_get_region(sysbus, 0));
/* IOSB subsystem */
object_initialize_child(OBJECT(machine), "iosb", &m->iosb, TYPE_IOSB);
sysbus = SYS_BUS_DEVICE(&m->iosb);
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
memory_region_add_subregion(&m->macio, IOSB_BASE - IO_BASE,
sysbus_mmio_get_region(sysbus, 0));
@@ -497,7 +497,7 @@ static void q800_machine_init(MachineState *machine)
qdev_prop_set_string(DEVICE(&m->asc), "audiodev", machine->audiodev);
}
sysbus = SYS_BUS_DEVICE(&m->asc);
- sysbus_realize_and_unref(sysbus, &error_fatal);
+ sysbus_realize(sysbus, &error_fatal);
memory_region_add_subregion(&m->macio, ASC_BASE - IO_BASE,
sysbus_mmio_get_region(sysbus, 0));
sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(DEVICE(&m->glue),
diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
index 2813705c03..a26babfbc2 100644
--- a/hw/misc/macio/macio.c
+++ b/hw/misc/macio/macio.c
@@ -274,7 +274,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
/* OpenPIC */
qdev_prop_set_uint32(pic_dev, "model", OPENPIC_MODEL_KEYLARGO);
sbd = SYS_BUS_DEVICE(&ns->pic);
- sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_realize(sbd, &error_fatal);
memory_region_add_subregion(&s->bar, 0x40000,
sysbus_mmio_get_region(sbd, 0));
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
index 38e0f64462..fddb0bbba3 100644
--- a/hw/net/imx_fec.c
+++ b/hw/net/imx_fec.c
@@ -1207,7 +1207,7 @@ static void imx_eth_realize(DeviceState *dev, Error **errp)
qemu_init_irq_child(OBJECT(s), "mii-irq", &s->mii_irq, imx_phy_update_irq, s, 0);
object_initialize_child(OBJECT(s), "mii", &s->mii, TYPE_LAN9118_PHY);
- if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(&s->mii), errp)) {
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->mii), errp)) {
return;
}
qdev_connect_gpio_out(DEVICE(&s->mii), 0, &s->mii_irq);
diff --git a/hw/net/lan9118.c b/hw/net/lan9118.c
index 2003280fc4..fa425bb5bb 100644
--- a/hw/net/lan9118.c
+++ b/hw/net/lan9118.c
@@ -1276,7 +1276,7 @@ static void lan9118_realize(DeviceState *dev, Error **errp)
qemu_init_irq_child(OBJECT(s), "mii-irq", &s->mii_irq, lan9118_update_irq, s, 0);
object_initialize_child(OBJECT(s), "mii", &s->mii, TYPE_LAN9118_PHY);
- if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(&s->mii), errp)) {
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->mii), errp)) {
return;
}
qdev_connect_gpio_out(DEVICE(&s->mii), 0, &s->mii_irq);
diff --git a/hw/nubus/nubus-virtio-mmio.c b/hw/nubus/nubus-virtio-mmio.c
index 63aeca5b12..29008ea6c2 100644
--- a/hw/nubus/nubus-virtio-mmio.c
+++ b/hw/nubus/nubus-virtio-mmio.c
@@ -51,7 +51,7 @@ static void nubus_virtio_mmio_realize(DeviceState *dev, Error **errp)
for (i = 0; i < NUBUS_VIRTIO_MMIO_NUM_DEVICES; i++) {
sbd = SYS_BUS_DEVICE(&s->virtio_mmio[i]);
qdev_prop_set_bit(DEVICE(sbd), "force-legacy", false);
- if (!sysbus_realize_and_unref(sbd, errp)) {
+ if (!sysbus_realize(sbd, errp)) {
return;
}
diff --git a/hw/pci-host/mv64361.c b/hw/pci-host/mv64361.c
index 3ef51fef1b..8c3dadd490 100644
--- a/hw/pci-host/mv64361.c
+++ b/hw/pci-host/mv64361.c
@@ -874,7 +874,7 @@ static void mv64361_realize(DeviceState *dev, Error **errp)
TYPE_MV64361_PCI);
DeviceState *pci = DEVICE(&s->pci[i]);
qdev_prop_set_uint8(pci, "index", i);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(pci), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(pci), &error_fatal);
}
sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->cpu_irq);
qdev_init_gpio_in_named(dev, mv64361_gpp_irq, "gpp", 32);
diff --git a/hw/xen/xen-pvh-common.c b/hw/xen/xen-pvh-common.c
index 76893c8fcf..9ced68afea 100644
--- a/hw/xen/xen-pvh-common.c
+++ b/hw/xen/xen-pvh-common.c
@@ -230,7 +230,7 @@ static inline void xenpvh_gpex_init(XenPVHMachineState *s,
object_initialize_child(OBJECT(s), "gpex", &s->pci.gpex,
TYPE_GPEX_HOST);
dev = DEVICE(&s->pci.gpex);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
ecam_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
memory_region_add_subregion(sysmem, s->cfg.pci_ecam.base, ecam_reg);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 129/134] hw: Parent board-created CPUs under the machine
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (127 preceding siblings ...)
2026-07-11 22:37 ` [RFC PATCH 128/134] hw: Pair object_initialize_child() with plain realize() Alexander Graf
@ 2026-07-11 22:37 ` Alexander Graf
2026-07-13 16:35 ` Bernhard Beschow
2026-07-13 20:01 ` Brian Cain
2026-07-11 22:37 ` [RFC PATCH 130/134] hw/pci-host/versatile: Use object_initialize_child() for pci_dev Alexander Graf
` (5 subsequent siblings)
134 siblings, 2 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:37 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
A number of boards create CPUs via object_new(cpu_type) followed
by property setting and qdev_realize(NULL), rather than through
cpu_create(). These CPUs currently fall into /machine/unattached
via the device_set_realized() fallback. Parent them explicitly
under the machine (or the CPS/SoC container that owns them) as
"cpu[*]", matching the naming convention used by cpu_create().
The subsequent object_unref() and qdev_realize_and_unref() calls
are converted to plain qdev_realize() (or dropped) since the
parent's child<> property now holds the reference. Error paths
switch to object_unparent().
The transient introspection object_new() in hw/arm/virt.c
machvirt_init() (probing pa_bits) is deliberately left as-is;
it is unref'd immediately without being realized.
hw/arm: integratorcp mps3r realview sbsa-ref versatilepb
vexpress virt xilinx-zynq
hw/hexagon: hexagon_dsp virt
hw/i386: x86-common xen-pvh
hw/loongarch: virt
hw/mips: cps
hw/ppc: e500 spapr (cpu-core)
hw/riscv: cps microblaze-v-generic
hw/s390x: s390-virtio-ccw
hw/sparc: leon3 sun4m
hw/sparc64: sparc64
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/arm/integratorcp.c | 3 ++-
hw/arm/mps3r.c | 4 ++--
hw/arm/realview.c | 3 ++-
hw/arm/sbsa-ref.c | 4 ++--
hw/arm/versatilepb.c | 3 ++-
hw/arm/vexpress.c | 3 ++-
hw/arm/virt.c | 4 ++--
hw/arm/xilinx_zynq.c | 3 ++-
hw/hexagon/hexagon_dsp.c | 5 +++--
hw/hexagon/virt.c | 5 +++--
hw/i386/x86-common.c | 9 ++++-----
hw/i386/xen/xen-pvh.c | 5 ++---
hw/loongarch/virt.c | 5 +++--
hw/mips/cps.c | 5 +++--
hw/ppc/e500.c | 5 +++--
hw/ppc/spapr.c | 4 ++--
hw/riscv/cps.c | 5 +++--
hw/riscv/microblaze-v-generic.c | 3 ++-
hw/s390x/s390-virtio-ccw.c | 16 +++++++---------
hw/sparc/leon3.c | 3 ++-
hw/sparc/sun4m.c | 5 +++--
hw/sparc64/sparc64.c | 3 ++-
22 files changed, 58 insertions(+), 47 deletions(-)
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 81c0bce8f9..30a6a940c5 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -598,7 +598,8 @@ static void integratorcp_init(MachineState *machine)
DriveInfo *dinfo;
int i;
- cpuobj = object_new(machine->cpu_type);
+ cpuobj = object_new_child(OBJECT(machine), "cpu[0]",
+ machine->cpu_type);
/* By default ARM1176 CPUs have EL3 enabled. This board does not
* currently support EL3 so the CPU EL3 property is disabled before
diff --git a/hw/arm/mps3r.c b/hw/arm/mps3r.c
index d6c29c1172..dd434eaefd 100644
--- a/hw/arm/mps3r.c
+++ b/hw/arm/mps3r.c
@@ -388,13 +388,13 @@ static void mps3r_common_init(MachineState *machine)
memory_region_add_subregion_overlap(&mms->cpu_sysmem[i], 0,
&mms->sysmem_alias[i], -1);
- mms->cpu[i] = object_new(machine->cpu_type);
+ mms->cpu[i] = object_new_child(OBJECT(mms), "cpu[*]",
+ machine->cpu_type);
object_property_set_link(mms->cpu[i], "memory",
OBJECT(&mms->cpu_sysmem[i]), &error_abort);
object_property_set_int(mms->cpu[i], "reset-cbar",
PERIPHBASE, &error_abort);
qdev_realize(DEVICE(mms->cpu[i]), NULL, &error_fatal);
- object_unref(mms->cpu[i]);
/* Per-CPU RAM */
memory_region_init_ram(&mms->cpu_ram[i], OBJECT(mms), ramname,
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index 99591e7d80..f938367131 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -119,7 +119,8 @@ static void realview_init(MachineState *machine,
}
for (n = 0; n < smp_cpus; n++) {
- Object *cpuobj = object_new(machine->cpu_type);
+ Object *cpuobj = object_new_child(OBJECT(machine), "cpu[*]",
+ machine->cpu_type);
/* By default A9,A15 and ARM1176 CPUs have EL3 enabled. This board
* does not currently support EL3 so the CPU EL3 property is disabled
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
index c9adc972c1..3b759d9209 100644
--- a/hw/arm/sbsa-ref.c
+++ b/hw/arm/sbsa-ref.c
@@ -783,7 +783,8 @@ static void sbsa_ref_init(MachineState *machine)
break;
}
- cpuobj = object_new(possible_cpus->cpus[n].type);
+ cpuobj = object_new_child(OBJECT(sms), "cpu[*]",
+ possible_cpus->cpus[n].type);
object_property_set_int(cpuobj, "mp-affinity",
possible_cpus->cpus[n].arch_id, NULL);
@@ -808,7 +809,6 @@ static void sbsa_ref_init(MachineState *machine)
OBJECT(secure_sysmem), &error_abort);
qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
- object_unref(cpuobj);
}
memory_region_add_subregion(sysmem, sbsa_ref_memmap[SBSA_MEM].base,
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index f68c4765c6..8d93fff207 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -208,7 +208,8 @@ static void versatile_init(MachineState *machine, int board_id)
exit(1);
}
- cpuobj = object_new(machine->cpu_type);
+ cpuobj = object_new_child(OBJECT(machine), "cpu[0]",
+ machine->cpu_type);
/* By default ARM1176 CPUs have EL3 enabled. This board does not
* currently support EL3 so the CPU EL3 property is disabled before
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index f877ccf330..986525b9ce 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -219,7 +219,8 @@ static void init_cpus(MachineState *ms, const char *cpu_type,
/* Create the actual CPUs */
for (n = 0; n < smp_cpus; n++) {
- Object *cpuobj = object_new(cpu_type);
+ Object *cpuobj = object_new_child(qdev_get_machine(), "cpu[*]",
+ cpu_type);
if (!secure) {
object_property_set_bool(cpuobj, "has_el3", false, NULL);
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index f2249a0b72..95e087d692 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -3039,7 +3039,8 @@ static void machvirt_init(MachineState *machine)
break;
}
- cpuobj = object_new(possible_cpus->cpus[n].type);
+ cpuobj = object_new_child(OBJECT(vms), "cpu[*]",
+ possible_cpus->cpus[n].type);
object_property_set_int(cpuobj, "mp-affinity",
possible_cpus->cpus[n].arch_id, NULL);
@@ -3139,7 +3140,6 @@ static void machvirt_init(MachineState *machine)
}
qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
- object_unref(cpuobj);
}
/* Now we've created the CPUs we can see if they have the hypvirt timer */
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 441289e63f..a2dcdd422d 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -222,7 +222,8 @@ static void zynq_init(MachineState *machine)
}
for (n = 0; n < smp_cpus; n++) {
- Object *cpuobj = object_new(machine->cpu_type);
+ Object *cpuobj = object_new_child(OBJECT(machine), "cpu[*]",
+ machine->cpu_type);
object_property_set_int(cpuobj, "midr", ZYNQ_BOARD_MIDR,
&error_fatal);
diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c
index 53dfe6741e..d78a987dca 100644
--- a/hw/hexagon/hexagon_dsp.c
+++ b/hw/hexagon/hexagon_dsp.c
@@ -143,7 +143,8 @@ static void hexagon_common_init(MachineState *machine, Rev_t rev,
sysbus_realize(SYS_BUS_DEVICE(tlb_dev), &error_fatal);
for (int i = 0; i < machine->smp.cpus; i++) {
- HexagonCPU *cpu = HEXAGON_CPU(object_new(machine->cpu_type));
+ HexagonCPU *cpu = HEXAGON_CPU(object_new_child(OBJECT(machine), "cpu[*]",
+ machine->cpu_type));
qemu_register_reset(do_cpu_reset, cpu);
/*
@@ -158,7 +159,7 @@ static void hexagon_common_init(MachineState *machine, Rev_t rev,
OBJECT(glob_regs_dev), &error_fatal);
object_property_set_link(OBJECT(cpu), "tlb",
OBJECT(tlb_dev), &error_fatal);
- qdev_realize_and_unref(DEVICE(cpu), NULL, &error_fatal);
+ qdev_realize(DEVICE(cpu), NULL, &error_fatal);
}
rom_add_blob_fixed_as("config_table.rom", &m_cfg->cfgtable,
diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c
index fb23cda19f..48f1e35dd3 100644
--- a/hw/hexagon/virt.c
+++ b/hw/hexagon/virt.c
@@ -280,7 +280,8 @@ static void virt_init(MachineState *ms)
cpu0 = NULL;
for (int i = 0; i < ms->smp.cpus; i++) {
- HexagonCPU *cpu = HEXAGON_CPU(object_new(ms->cpu_type));
+ HexagonCPU *cpu = HEXAGON_CPU(object_new_child(OBJECT(ms), "cpu[*]",
+ ms->cpu_type));
qemu_register_reset(do_cpu_reset, cpu);
if (i == 0) {
@@ -300,7 +301,7 @@ static void virt_init(MachineState *ms)
object_property_set_link(OBJECT(cpu), "tlb",
OBJECT(tlb_dev), &error_fatal);
- qdev_realize_and_unref(DEVICE(cpu), NULL, &error_fatal);
+ qdev_realize(DEVICE(cpu), NULL, &error_fatal);
}
fdt_add_cpu_nodes(vms);
clk_phandle = fdt_add_clocks(vms);
diff --git a/hw/i386/x86-common.c b/hw/i386/x86-common.c
index 151a67ee5f..5bbfee737e 100644
--- a/hw/i386/x86-common.c
+++ b/hw/i386/x86-common.c
@@ -55,15 +55,14 @@ static size_t pvh_start_addr;
static void x86_cpu_new(X86MachineState *x86ms, int64_t apic_id, Error **errp)
{
- Object *cpu = object_new(MACHINE(x86ms)->cpu_type);
+ Object *cpu = object_new_child(OBJECT(x86ms), "cpu[*]",
+ MACHINE(x86ms)->cpu_type);
if (!object_property_set_uint(cpu, "apic-id", apic_id, errp)) {
- goto out;
+ object_unparent(cpu);
+ return;
}
qdev_realize(DEVICE(cpu), NULL, errp);
-
-out:
- object_unref(cpu);
}
void x86_cpus_init(X86MachineState *x86ms, int default_cpu_version)
diff --git a/hw/i386/xen/xen-pvh.c b/hw/i386/xen/xen-pvh.c
index ab90c83a83..7aef48ad61 100644
--- a/hw/i386/xen/xen-pvh.c
+++ b/hw/i386/xen/xen-pvh.c
@@ -29,12 +29,11 @@ struct XenPVHx86State {
static DeviceState *xen_pvh_cpu_new(MachineState *ms,
int64_t apic_id)
{
- Object *cpu = object_new(ms->cpu_type);
+ Object *cpu = object_new_child(OBJECT(ms), "cpu[*]",
+ ms->cpu_type);
- object_property_add_child(OBJECT(ms), "cpu[*]", cpu);
object_property_set_uint(cpu, "apic-id", apic_id, &error_fatal);
qdev_realize(DEVICE(cpu), NULL, &error_fatal);
- object_unref(cpu);
return DEVICE(cpu);
}
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 580ef0bb3e..b749aafdbe 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -948,13 +948,14 @@ static void virt_init(MachineState *machine)
/* Init CPUs */
mc->possible_cpu_arch_ids(machine);
for (i = 0; i < machine->smp.cpus; i++) {
- cpuobj = object_new(machine->cpu_type);
+ cpuobj = object_new_child(OBJECT(machine), "cpu[*]",
+ machine->cpu_type);
if (cpuobj == NULL) {
error_report("Fail to create object with type %s ",
machine->cpu_type);
exit(EXIT_FAILURE);
}
- qdev_realize_and_unref(DEVICE(cpuobj), NULL, &error_fatal);
+ qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
}
virt_check_dmsi(machine);
fw_cfg_add_memory(machine);
diff --git a/hw/mips/cps.c b/hw/mips/cps.c
index 620ee972f8..b997608373 100644
--- a/hw/mips/cps.c
+++ b/hw/mips/cps.c
@@ -74,7 +74,8 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
}
for (int i = 0; i < s->num_vp; i++) {
- MIPSCPU *cpu = MIPS_CPU(object_new(s->cpu_type));
+ MIPSCPU *cpu = MIPS_CPU(object_new_child(OBJECT(s), "cpu[*]",
+ s->cpu_type));
CPUMIPSState *env = &cpu->env;
object_property_set_bool(OBJECT(cpu), "big-endian", s->cpu_is_bigendian,
@@ -87,7 +88,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
/* All cores use the same clock tree */
qdev_connect_clock_in(DEVICE(cpu), "clk-in", s->clock);
- if (!qdev_realize_and_unref(DEVICE(cpu), NULL, errp)) {
+ if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
return;
}
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index f3917c0755..a0eb25e956 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -941,7 +941,8 @@ void ppce500_init(MachineState *machine)
PowerPCCPU *cpu;
CPUState *cs;
- cpu = POWERPC_CPU(object_new(machine->cpu_type));
+ cpu = POWERPC_CPU(object_new_child(OBJECT(machine), "cpu[*]",
+ machine->cpu_type));
env = &cpu->env;
cs = CPU(cpu);
@@ -956,7 +957,7 @@ void ppce500_init(MachineState *machine)
*/
object_property_set_bool(OBJECT(cs), "start-powered-off", i != 0,
&error_abort);
- qdev_realize_and_unref(DEVICE(cs), NULL, &error_fatal);
+ qdev_realize(DEVICE(cs), NULL, &error_fatal);
if (!firstenv) {
firstenv = env;
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 9b6b5e7257..e6c1b7f0b1 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2776,7 +2776,8 @@ static void spapr_init_cpus(SpaprMachineState *spapr)
}
if (i < boot_cores_nr) {
- Object *core = object_new(type);
+ Object *core = object_new_child(OBJECT(spapr), "cpu-core[*]",
+ type);
int nr_threads = smp_threads;
/* Handle the partially filled core for older machine types */
@@ -2790,7 +2791,6 @@ static void spapr_init_cpus(SpaprMachineState *spapr)
&error_fatal);
qdev_realize(DEVICE(core), NULL, &error_fatal);
- object_unref(core);
}
}
}
diff --git a/hw/riscv/cps.c b/hw/riscv/cps.c
index b6b30e05e1..2bf506b61a 100644
--- a/hw/riscv/cps.c
+++ b/hw/riscv/cps.c
@@ -63,13 +63,14 @@ static void riscv_cps_realize(DeviceState *dev, Error **errp)
int harts_in_cluster = s->num_hart * s->num_core;
int num_of_clusters = s->num_vp / harts_in_cluster;
for (i = 0; i < s->num_vp; i++) {
- cpu = RISCV_CPU(object_new(s->cpu_type));
+ cpu = RISCV_CPU(object_new_child(OBJECT(s), "cpu[*]",
+ s->cpu_type));
/* All VPs are halted on reset. Leave powering up to CPC. */
object_property_set_bool(OBJECT(cpu), "start-powered-off", true,
&error_abort);
- if (!qdev_realize_and_unref(DEVICE(cpu), NULL, errp)) {
+ if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
return;
}
diff --git a/hw/riscv/microblaze-v-generic.c b/hw/riscv/microblaze-v-generic.c
index 0a83932405..f97ce402e6 100644
--- a/hw/riscv/microblaze-v-generic.c
+++ b/hw/riscv/microblaze-v-generic.c
@@ -65,7 +65,8 @@ static void mb_v_generic_init(MachineState *machine)
qemu_irq irq[32];
MemoryRegion *sysmem = get_system_memory();
- cpu = RISCV_CPU(object_new(machine->cpu_type));
+ cpu = RISCV_CPU(object_new_child(OBJECT(machine), "cpu[0]",
+ machine->cpu_type));
object_property_set_bool(OBJECT(cpu), "h", false, NULL);
object_property_set_bool(OBJECT(cpu), "d", false, NULL);
qdev_realize(DEVICE(cpu), NULL, &error_abort);
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 037cb6eb5e..0625d4a8df 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -56,20 +56,18 @@ static Error *pv_mig_blocker;
static S390CPU *s390x_new_cpu(const char *typename, uint32_t core_id,
Error **errp)
{
- S390CPU *cpu = S390_CPU(object_new(typename));
- S390CPU *ret = NULL;
+ S390CPU *cpu = S390_CPU(object_new_child(qdev_get_machine(), "cpu[*]",
+ typename));
if (!object_property_set_int(OBJECT(cpu), "core-id", core_id, errp)) {
- goto out;
+ object_unparent(OBJECT(cpu));
+ return NULL;
}
if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
- goto out;
+ object_unparent(OBJECT(cpu));
+ return NULL;
}
- ret = cpu;
-
-out:
- object_unref(OBJECT(cpu));
- return ret;
+ return cpu;
}
static void s390_init_cpus(MachineState *machine)
diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index f9ef2758e1..a2781bcc32 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -278,7 +278,8 @@ static void leon3_generic_hw_init(MachineState *machine)
for (i = 0; i < machine->smp.cpus; i++) {
/* Init CPU */
- cpu = SPARC_CPU(object_new(machine->cpu_type));
+ cpu = SPARC_CPU(object_new_child(OBJECT(machine), "cpu[*]",
+ machine->cpu_type));
qdev_init_gpio_in_named(DEVICE(cpu), leon3_start_cpu, "start_cpu", 1);
qdev_init_gpio_in_named(DEVICE(cpu), leon3_set_pil_in, "pil", 1);
qdev_realize(DEVICE(cpu), NULL, &error_fatal);
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 51f5468a02..1ae9d834ca 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -787,7 +787,8 @@ static DeviceState *cpu_devinit(const char *cpu_type, unsigned int id,
CPUSPARCState *env;
DeviceState *cpudev;
- cpu = SPARC_CPU(object_new(cpu_type));
+ cpu = SPARC_CPU(object_new_child(qdev_get_machine(), "cpu[*]",
+ cpu_type));
env = &cpu->env;
cpudev = DEVICE(cpu);
@@ -795,7 +796,7 @@ static DeviceState *cpu_devinit(const char *cpu_type, unsigned int id,
object_property_set_bool(OBJECT(cpu), "start-powered-off", id != 0,
&error_abort);
qdev_init_gpio_in_named(cpudev, cpu_set_irq, "pil", MAX_PILS);
- qdev_realize_and_unref(cpudev, NULL, &error_fatal);
+ qdev_realize(cpudev, NULL, &error_fatal);
cpu_sparc_set_id(env, id);
env->prom_addr = prom_addr;
return cpudev;
diff --git a/hw/sparc64/sparc64.c b/hw/sparc64/sparc64.c
index 16f4aa052b..9092c4193e 100644
--- a/hw/sparc64/sparc64.c
+++ b/hw/sparc64/sparc64.c
@@ -272,7 +272,8 @@ SPARCCPU *sparc64_cpu_devinit(const char *cpu_type, uint64_t prom_addr)
uint32_t stick_frequency = 100 * 1000000;
uint32_t hstick_frequency = 100 * 1000000;
- cpu = SPARC_CPU(object_new(cpu_type));
+ cpu = SPARC_CPU(object_new_child(qdev_get_machine(), "cpu[0]",
+ cpu_type));
qdev_init_gpio_in_named(DEVICE(cpu), sparc64_cpu_set_ivec_irq,
"ivec-irq", IVEC_MAX);
qdev_realize(DEVICE(cpu), NULL, &error_fatal);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 129/134] hw: Parent board-created CPUs under the machine
2026-07-11 22:37 ` [RFC PATCH 129/134] hw: Parent board-created CPUs under the machine Alexander Graf
@ 2026-07-13 16:35 ` Bernhard Beschow
2026-07-13 20:01 ` Brian Cain
1 sibling, 0 replies; 156+ messages in thread
From: Bernhard Beschow @ 2026-07-13 16:35 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Stafford Horne, Sergio Lopez,
Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Am 11. Juli 2026 22:37:02 UTC schrieb Alexander Graf <graf@amazon.com>:
>A number of boards create CPUs via object_new(cpu_type) followed
>by property setting and qdev_realize(NULL), rather than through
>cpu_create(). These CPUs currently fall into /machine/unattached
>via the device_set_realized() fallback. Parent them explicitly
>under the machine (or the CPS/SoC container that owns them) as
>"cpu[*]", matching the naming convention used by cpu_create().
>
>The subsequent object_unref() and qdev_realize_and_unref() calls
>are converted to plain qdev_realize() (or dropped) since the
>parent's child<> property now holds the reference. Error paths
>switch to object_unparent().
>
>The transient introspection object_new() in hw/arm/virt.c
>machvirt_init() (probing pa_bits) is deliberately left as-is;
>it is unref'd immediately without being realized.
>
> hw/arm: integratorcp mps3r realview sbsa-ref versatilepb
> vexpress virt xilinx-zynq
> hw/hexagon: hexagon_dsp virt
> hw/i386: x86-common xen-pvh
> hw/loongarch: virt
> hw/mips: cps
> hw/ppc: e500 spapr (cpu-core)
> hw/riscv: cps microblaze-v-generic
> hw/s390x: s390-virtio-ccw
> hw/sparc: leon3 sun4m
> hw/sparc64: sparc64
>
>Assisted-by: Kiro
>Signed-off-by: Alexander Graf <graf@amazon.com>
For e500 where migration compatibility is not an issue:
Acked-by: Bernhard Beschow <shentey@gmail.com>
>---
> hw/arm/integratorcp.c | 3 ++-
> hw/arm/mps3r.c | 4 ++--
> hw/arm/realview.c | 3 ++-
> hw/arm/sbsa-ref.c | 4 ++--
> hw/arm/versatilepb.c | 3 ++-
> hw/arm/vexpress.c | 3 ++-
> hw/arm/virt.c | 4 ++--
> hw/arm/xilinx_zynq.c | 3 ++-
> hw/hexagon/hexagon_dsp.c | 5 +++--
> hw/hexagon/virt.c | 5 +++--
> hw/i386/x86-common.c | 9 ++++-----
> hw/i386/xen/xen-pvh.c | 5 ++---
> hw/loongarch/virt.c | 5 +++--
> hw/mips/cps.c | 5 +++--
> hw/ppc/e500.c | 5 +++--
> hw/ppc/spapr.c | 4 ++--
> hw/riscv/cps.c | 5 +++--
> hw/riscv/microblaze-v-generic.c | 3 ++-
> hw/s390x/s390-virtio-ccw.c | 16 +++++++---------
> hw/sparc/leon3.c | 3 ++-
> hw/sparc/sun4m.c | 5 +++--
> hw/sparc64/sparc64.c | 3 ++-
> 22 files changed, 58 insertions(+), 47 deletions(-)
>
>diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
>index 81c0bce8f9..30a6a940c5 100644
>--- a/hw/arm/integratorcp.c
>+++ b/hw/arm/integratorcp.c
>@@ -598,7 +598,8 @@ static void integratorcp_init(MachineState *machine)
> DriveInfo *dinfo;
> int i;
>
>- cpuobj = object_new(machine->cpu_type);
>+ cpuobj = object_new_child(OBJECT(machine), "cpu[0]",
>+ machine->cpu_type);
>
> /* By default ARM1176 CPUs have EL3 enabled. This board does not
> * currently support EL3 so the CPU EL3 property is disabled before
>diff --git a/hw/arm/mps3r.c b/hw/arm/mps3r.c
>index d6c29c1172..dd434eaefd 100644
>--- a/hw/arm/mps3r.c
>+++ b/hw/arm/mps3r.c
>@@ -388,13 +388,13 @@ static void mps3r_common_init(MachineState *machine)
> memory_region_add_subregion_overlap(&mms->cpu_sysmem[i], 0,
> &mms->sysmem_alias[i], -1);
>
>- mms->cpu[i] = object_new(machine->cpu_type);
>+ mms->cpu[i] = object_new_child(OBJECT(mms), "cpu[*]",
>+ machine->cpu_type);
> object_property_set_link(mms->cpu[i], "memory",
> OBJECT(&mms->cpu_sysmem[i]), &error_abort);
> object_property_set_int(mms->cpu[i], "reset-cbar",
> PERIPHBASE, &error_abort);
> qdev_realize(DEVICE(mms->cpu[i]), NULL, &error_fatal);
>- object_unref(mms->cpu[i]);
>
> /* Per-CPU RAM */
> memory_region_init_ram(&mms->cpu_ram[i], OBJECT(mms), ramname,
>diff --git a/hw/arm/realview.c b/hw/arm/realview.c
>index 99591e7d80..f938367131 100644
>--- a/hw/arm/realview.c
>+++ b/hw/arm/realview.c
>@@ -119,7 +119,8 @@ static void realview_init(MachineState *machine,
> }
>
> for (n = 0; n < smp_cpus; n++) {
>- Object *cpuobj = object_new(machine->cpu_type);
>+ Object *cpuobj = object_new_child(OBJECT(machine), "cpu[*]",
>+ machine->cpu_type);
>
> /* By default A9,A15 and ARM1176 CPUs have EL3 enabled. This board
> * does not currently support EL3 so the CPU EL3 property is disabled
>diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
>index c9adc972c1..3b759d9209 100644
>--- a/hw/arm/sbsa-ref.c
>+++ b/hw/arm/sbsa-ref.c
>@@ -783,7 +783,8 @@ static void sbsa_ref_init(MachineState *machine)
> break;
> }
>
>- cpuobj = object_new(possible_cpus->cpus[n].type);
>+ cpuobj = object_new_child(OBJECT(sms), "cpu[*]",
>+ possible_cpus->cpus[n].type);
> object_property_set_int(cpuobj, "mp-affinity",
> possible_cpus->cpus[n].arch_id, NULL);
>
>@@ -808,7 +809,6 @@ static void sbsa_ref_init(MachineState *machine)
> OBJECT(secure_sysmem), &error_abort);
>
> qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
>- object_unref(cpuobj);
> }
>
> memory_region_add_subregion(sysmem, sbsa_ref_memmap[SBSA_MEM].base,
>diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
>index f68c4765c6..8d93fff207 100644
>--- a/hw/arm/versatilepb.c
>+++ b/hw/arm/versatilepb.c
>@@ -208,7 +208,8 @@ static void versatile_init(MachineState *machine, int board_id)
> exit(1);
> }
>
>- cpuobj = object_new(machine->cpu_type);
>+ cpuobj = object_new_child(OBJECT(machine), "cpu[0]",
>+ machine->cpu_type);
>
> /* By default ARM1176 CPUs have EL3 enabled. This board does not
> * currently support EL3 so the CPU EL3 property is disabled before
>diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
>index f877ccf330..986525b9ce 100644
>--- a/hw/arm/vexpress.c
>+++ b/hw/arm/vexpress.c
>@@ -219,7 +219,8 @@ static void init_cpus(MachineState *ms, const char *cpu_type,
>
> /* Create the actual CPUs */
> for (n = 0; n < smp_cpus; n++) {
>- Object *cpuobj = object_new(cpu_type);
>+ Object *cpuobj = object_new_child(qdev_get_machine(), "cpu[*]",
>+ cpu_type);
>
> if (!secure) {
> object_property_set_bool(cpuobj, "has_el3", false, NULL);
>diff --git a/hw/arm/virt.c b/hw/arm/virt.c
>index f2249a0b72..95e087d692 100644
>--- a/hw/arm/virt.c
>+++ b/hw/arm/virt.c
>@@ -3039,7 +3039,8 @@ static void machvirt_init(MachineState *machine)
> break;
> }
>
>- cpuobj = object_new(possible_cpus->cpus[n].type);
>+ cpuobj = object_new_child(OBJECT(vms), "cpu[*]",
>+ possible_cpus->cpus[n].type);
> object_property_set_int(cpuobj, "mp-affinity",
> possible_cpus->cpus[n].arch_id, NULL);
>
>@@ -3139,7 +3140,6 @@ static void machvirt_init(MachineState *machine)
> }
>
> qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
>- object_unref(cpuobj);
> }
>
> /* Now we've created the CPUs we can see if they have the hypvirt timer */
>diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
>index 441289e63f..a2dcdd422d 100644
>--- a/hw/arm/xilinx_zynq.c
>+++ b/hw/arm/xilinx_zynq.c
>@@ -222,7 +222,8 @@ static void zynq_init(MachineState *machine)
> }
>
> for (n = 0; n < smp_cpus; n++) {
>- Object *cpuobj = object_new(machine->cpu_type);
>+ Object *cpuobj = object_new_child(OBJECT(machine), "cpu[*]",
>+ machine->cpu_type);
>
> object_property_set_int(cpuobj, "midr", ZYNQ_BOARD_MIDR,
> &error_fatal);
>diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c
>index 53dfe6741e..d78a987dca 100644
>--- a/hw/hexagon/hexagon_dsp.c
>+++ b/hw/hexagon/hexagon_dsp.c
>@@ -143,7 +143,8 @@ static void hexagon_common_init(MachineState *machine, Rev_t rev,
> sysbus_realize(SYS_BUS_DEVICE(tlb_dev), &error_fatal);
>
> for (int i = 0; i < machine->smp.cpus; i++) {
>- HexagonCPU *cpu = HEXAGON_CPU(object_new(machine->cpu_type));
>+ HexagonCPU *cpu = HEXAGON_CPU(object_new_child(OBJECT(machine), "cpu[*]",
>+ machine->cpu_type));
> qemu_register_reset(do_cpu_reset, cpu);
>
> /*
>@@ -158,7 +159,7 @@ static void hexagon_common_init(MachineState *machine, Rev_t rev,
> OBJECT(glob_regs_dev), &error_fatal);
> object_property_set_link(OBJECT(cpu), "tlb",
> OBJECT(tlb_dev), &error_fatal);
>- qdev_realize_and_unref(DEVICE(cpu), NULL, &error_fatal);
>+ qdev_realize(DEVICE(cpu), NULL, &error_fatal);
> }
>
> rom_add_blob_fixed_as("config_table.rom", &m_cfg->cfgtable,
>diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c
>index fb23cda19f..48f1e35dd3 100644
>--- a/hw/hexagon/virt.c
>+++ b/hw/hexagon/virt.c
>@@ -280,7 +280,8 @@ static void virt_init(MachineState *ms)
>
> cpu0 = NULL;
> for (int i = 0; i < ms->smp.cpus; i++) {
>- HexagonCPU *cpu = HEXAGON_CPU(object_new(ms->cpu_type));
>+ HexagonCPU *cpu = HEXAGON_CPU(object_new_child(OBJECT(ms), "cpu[*]",
>+ ms->cpu_type));
> qemu_register_reset(do_cpu_reset, cpu);
>
> if (i == 0) {
>@@ -300,7 +301,7 @@ static void virt_init(MachineState *ms)
> object_property_set_link(OBJECT(cpu), "tlb",
> OBJECT(tlb_dev), &error_fatal);
>
>- qdev_realize_and_unref(DEVICE(cpu), NULL, &error_fatal);
>+ qdev_realize(DEVICE(cpu), NULL, &error_fatal);
> }
> fdt_add_cpu_nodes(vms);
> clk_phandle = fdt_add_clocks(vms);
>diff --git a/hw/i386/x86-common.c b/hw/i386/x86-common.c
>index 151a67ee5f..5bbfee737e 100644
>--- a/hw/i386/x86-common.c
>+++ b/hw/i386/x86-common.c
>@@ -55,15 +55,14 @@ static size_t pvh_start_addr;
>
> static void x86_cpu_new(X86MachineState *x86ms, int64_t apic_id, Error **errp)
> {
>- Object *cpu = object_new(MACHINE(x86ms)->cpu_type);
>+ Object *cpu = object_new_child(OBJECT(x86ms), "cpu[*]",
>+ MACHINE(x86ms)->cpu_type);
>
> if (!object_property_set_uint(cpu, "apic-id", apic_id, errp)) {
>- goto out;
>+ object_unparent(cpu);
>+ return;
> }
> qdev_realize(DEVICE(cpu), NULL, errp);
>-
>-out:
>- object_unref(cpu);
> }
>
> void x86_cpus_init(X86MachineState *x86ms, int default_cpu_version)
>diff --git a/hw/i386/xen/xen-pvh.c b/hw/i386/xen/xen-pvh.c
>index ab90c83a83..7aef48ad61 100644
>--- a/hw/i386/xen/xen-pvh.c
>+++ b/hw/i386/xen/xen-pvh.c
>@@ -29,12 +29,11 @@ struct XenPVHx86State {
> static DeviceState *xen_pvh_cpu_new(MachineState *ms,
> int64_t apic_id)
> {
>- Object *cpu = object_new(ms->cpu_type);
>+ Object *cpu = object_new_child(OBJECT(ms), "cpu[*]",
>+ ms->cpu_type);
>
>- object_property_add_child(OBJECT(ms), "cpu[*]", cpu);
> object_property_set_uint(cpu, "apic-id", apic_id, &error_fatal);
> qdev_realize(DEVICE(cpu), NULL, &error_fatal);
>- object_unref(cpu);
>
> return DEVICE(cpu);
> }
>diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
>index 580ef0bb3e..b749aafdbe 100644
>--- a/hw/loongarch/virt.c
>+++ b/hw/loongarch/virt.c
>@@ -948,13 +948,14 @@ static void virt_init(MachineState *machine)
> /* Init CPUs */
> mc->possible_cpu_arch_ids(machine);
> for (i = 0; i < machine->smp.cpus; i++) {
>- cpuobj = object_new(machine->cpu_type);
>+ cpuobj = object_new_child(OBJECT(machine), "cpu[*]",
>+ machine->cpu_type);
> if (cpuobj == NULL) {
> error_report("Fail to create object with type %s ",
> machine->cpu_type);
> exit(EXIT_FAILURE);
> }
>- qdev_realize_and_unref(DEVICE(cpuobj), NULL, &error_fatal);
>+ qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
> }
> virt_check_dmsi(machine);
> fw_cfg_add_memory(machine);
>diff --git a/hw/mips/cps.c b/hw/mips/cps.c
>index 620ee972f8..b997608373 100644
>--- a/hw/mips/cps.c
>+++ b/hw/mips/cps.c
>@@ -74,7 +74,8 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
> }
>
> for (int i = 0; i < s->num_vp; i++) {
>- MIPSCPU *cpu = MIPS_CPU(object_new(s->cpu_type));
>+ MIPSCPU *cpu = MIPS_CPU(object_new_child(OBJECT(s), "cpu[*]",
>+ s->cpu_type));
> CPUMIPSState *env = &cpu->env;
>
> object_property_set_bool(OBJECT(cpu), "big-endian", s->cpu_is_bigendian,
>@@ -87,7 +88,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
> /* All cores use the same clock tree */
> qdev_connect_clock_in(DEVICE(cpu), "clk-in", s->clock);
>
>- if (!qdev_realize_and_unref(DEVICE(cpu), NULL, errp)) {
>+ if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
> return;
> }
>
>diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
>index f3917c0755..a0eb25e956 100644
>--- a/hw/ppc/e500.c
>+++ b/hw/ppc/e500.c
>@@ -941,7 +941,8 @@ void ppce500_init(MachineState *machine)
> PowerPCCPU *cpu;
> CPUState *cs;
>
>- cpu = POWERPC_CPU(object_new(machine->cpu_type));
>+ cpu = POWERPC_CPU(object_new_child(OBJECT(machine), "cpu[*]",
>+ machine->cpu_type));
> env = &cpu->env;
> cs = CPU(cpu);
>
>@@ -956,7 +957,7 @@ void ppce500_init(MachineState *machine)
> */
> object_property_set_bool(OBJECT(cs), "start-powered-off", i != 0,
> &error_abort);
>- qdev_realize_and_unref(DEVICE(cs), NULL, &error_fatal);
>+ qdev_realize(DEVICE(cs), NULL, &error_fatal);
>
> if (!firstenv) {
> firstenv = env;
>diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
>index 9b6b5e7257..e6c1b7f0b1 100644
>--- a/hw/ppc/spapr.c
>+++ b/hw/ppc/spapr.c
>@@ -2776,7 +2776,8 @@ static void spapr_init_cpus(SpaprMachineState *spapr)
> }
>
> if (i < boot_cores_nr) {
>- Object *core = object_new(type);
>+ Object *core = object_new_child(OBJECT(spapr), "cpu-core[*]",
>+ type);
> int nr_threads = smp_threads;
>
> /* Handle the partially filled core for older machine types */
>@@ -2790,7 +2791,6 @@ static void spapr_init_cpus(SpaprMachineState *spapr)
> &error_fatal);
> qdev_realize(DEVICE(core), NULL, &error_fatal);
>
>- object_unref(core);
> }
> }
> }
>diff --git a/hw/riscv/cps.c b/hw/riscv/cps.c
>index b6b30e05e1..2bf506b61a 100644
>--- a/hw/riscv/cps.c
>+++ b/hw/riscv/cps.c
>@@ -63,13 +63,14 @@ static void riscv_cps_realize(DeviceState *dev, Error **errp)
> int harts_in_cluster = s->num_hart * s->num_core;
> int num_of_clusters = s->num_vp / harts_in_cluster;
> for (i = 0; i < s->num_vp; i++) {
>- cpu = RISCV_CPU(object_new(s->cpu_type));
>+ cpu = RISCV_CPU(object_new_child(OBJECT(s), "cpu[*]",
>+ s->cpu_type));
>
> /* All VPs are halted on reset. Leave powering up to CPC. */
> object_property_set_bool(OBJECT(cpu), "start-powered-off", true,
> &error_abort);
>
>- if (!qdev_realize_and_unref(DEVICE(cpu), NULL, errp)) {
>+ if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
> return;
> }
>
>diff --git a/hw/riscv/microblaze-v-generic.c b/hw/riscv/microblaze-v-generic.c
>index 0a83932405..f97ce402e6 100644
>--- a/hw/riscv/microblaze-v-generic.c
>+++ b/hw/riscv/microblaze-v-generic.c
>@@ -65,7 +65,8 @@ static void mb_v_generic_init(MachineState *machine)
> qemu_irq irq[32];
> MemoryRegion *sysmem = get_system_memory();
>
>- cpu = RISCV_CPU(object_new(machine->cpu_type));
>+ cpu = RISCV_CPU(object_new_child(OBJECT(machine), "cpu[0]",
>+ machine->cpu_type));
> object_property_set_bool(OBJECT(cpu), "h", false, NULL);
> object_property_set_bool(OBJECT(cpu), "d", false, NULL);
> qdev_realize(DEVICE(cpu), NULL, &error_abort);
>diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
>index 037cb6eb5e..0625d4a8df 100644
>--- a/hw/s390x/s390-virtio-ccw.c
>+++ b/hw/s390x/s390-virtio-ccw.c
>@@ -56,20 +56,18 @@ static Error *pv_mig_blocker;
> static S390CPU *s390x_new_cpu(const char *typename, uint32_t core_id,
> Error **errp)
> {
>- S390CPU *cpu = S390_CPU(object_new(typename));
>- S390CPU *ret = NULL;
>+ S390CPU *cpu = S390_CPU(object_new_child(qdev_get_machine(), "cpu[*]",
>+ typename));
>
> if (!object_property_set_int(OBJECT(cpu), "core-id", core_id, errp)) {
>- goto out;
>+ object_unparent(OBJECT(cpu));
>+ return NULL;
> }
> if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
>- goto out;
>+ object_unparent(OBJECT(cpu));
>+ return NULL;
> }
>- ret = cpu;
>-
>-out:
>- object_unref(OBJECT(cpu));
>- return ret;
>+ return cpu;
> }
>
> static void s390_init_cpus(MachineState *machine)
>diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
>index f9ef2758e1..a2781bcc32 100644
>--- a/hw/sparc/leon3.c
>+++ b/hw/sparc/leon3.c
>@@ -278,7 +278,8 @@ static void leon3_generic_hw_init(MachineState *machine)
>
> for (i = 0; i < machine->smp.cpus; i++) {
> /* Init CPU */
>- cpu = SPARC_CPU(object_new(machine->cpu_type));
>+ cpu = SPARC_CPU(object_new_child(OBJECT(machine), "cpu[*]",
>+ machine->cpu_type));
> qdev_init_gpio_in_named(DEVICE(cpu), leon3_start_cpu, "start_cpu", 1);
> qdev_init_gpio_in_named(DEVICE(cpu), leon3_set_pil_in, "pil", 1);
> qdev_realize(DEVICE(cpu), NULL, &error_fatal);
>diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
>index 51f5468a02..1ae9d834ca 100644
>--- a/hw/sparc/sun4m.c
>+++ b/hw/sparc/sun4m.c
>@@ -787,7 +787,8 @@ static DeviceState *cpu_devinit(const char *cpu_type, unsigned int id,
> CPUSPARCState *env;
> DeviceState *cpudev;
>
>- cpu = SPARC_CPU(object_new(cpu_type));
>+ cpu = SPARC_CPU(object_new_child(qdev_get_machine(), "cpu[*]",
>+ cpu_type));
> env = &cpu->env;
> cpudev = DEVICE(cpu);
>
>@@ -795,7 +796,7 @@ static DeviceState *cpu_devinit(const char *cpu_type, unsigned int id,
> object_property_set_bool(OBJECT(cpu), "start-powered-off", id != 0,
> &error_abort);
> qdev_init_gpio_in_named(cpudev, cpu_set_irq, "pil", MAX_PILS);
>- qdev_realize_and_unref(cpudev, NULL, &error_fatal);
>+ qdev_realize(cpudev, NULL, &error_fatal);
> cpu_sparc_set_id(env, id);
> env->prom_addr = prom_addr;
> return cpudev;
>diff --git a/hw/sparc64/sparc64.c b/hw/sparc64/sparc64.c
>index 16f4aa052b..9092c4193e 100644
>--- a/hw/sparc64/sparc64.c
>+++ b/hw/sparc64/sparc64.c
>@@ -272,7 +272,8 @@ SPARCCPU *sparc64_cpu_devinit(const char *cpu_type, uint64_t prom_addr)
> uint32_t stick_frequency = 100 * 1000000;
> uint32_t hstick_frequency = 100 * 1000000;
>
>- cpu = SPARC_CPU(object_new(cpu_type));
>+ cpu = SPARC_CPU(object_new_child(qdev_get_machine(), "cpu[0]",
>+ cpu_type));
> qdev_init_gpio_in_named(DEVICE(cpu), sparc64_cpu_set_ivec_irq,
> "ivec-irq", IVEC_MAX);
> qdev_realize(DEVICE(cpu), NULL, &error_fatal);
^ permalink raw reply [flat|nested] 156+ messages in thread* Re: [RFC PATCH 129/134] hw: Parent board-created CPUs under the machine
2026-07-11 22:37 ` [RFC PATCH 129/134] hw: Parent board-created CPUs under the machine Alexander Graf
2026-07-13 16:35 ` Bernhard Beschow
@ 2026-07-13 20:01 ` Brian Cain
1 sibling, 0 replies; 156+ messages in thread
From: Brian Cain @ 2026-07-13 20:01 UTC (permalink / raw)
To: Alexander Graf
Cc: qemu-devel, qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Hendrik Brueckner, Chao Liu, Huacai Chen,
Clément Chigot, Cédric Le Goater, Helge Deller,
Dorjoy Chowdhury, Edgar E . Iglesias, Alexandre Iooss,
Eric Farman, Francisco Iglesias, Gaurav Sharma, Gautam Gala,
Harsh Prateek Bora, Hervé Poussineau, Jan Kiszka,
Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
On Sat, Jul 11, 2026 at 6:11 PM Alexander Graf <graf@amazon.com> wrote:
>
> A number of boards create CPUs via object_new(cpu_type) followed
> by property setting and qdev_realize(NULL), rather than through
> cpu_create(). These CPUs currently fall into /machine/unattached
> via the device_set_realized() fallback. Parent them explicitly
> under the machine (or the CPS/SoC container that owns them) as
> "cpu[*]", matching the naming convention used by cpu_create().
>
> The subsequent object_unref() and qdev_realize_and_unref() calls
> are converted to plain qdev_realize() (or dropped) since the
> parent's child<> property now holds the reference. Error paths
> switch to object_unparent().
>
> The transient introspection object_new() in hw/arm/virt.c
> machvirt_init() (probing pa_bits) is deliberately left as-is;
> it is unref'd immediately without being realized.
>
> hw/arm: integratorcp mps3r realview sbsa-ref versatilepb
> vexpress virt xilinx-zynq
> hw/hexagon: hexagon_dsp virt
> hw/i386: x86-common xen-pvh
> hw/loongarch: virt
> hw/mips: cps
> hw/ppc: e500 spapr (cpu-core)
> hw/riscv: cps microblaze-v-generic
> hw/s390x: s390-virtio-ccw
> hw/sparc: leon3 sun4m
> hw/sparc64: sparc64
>
> Assisted-by: Kiro
> Signed-off-by: Alexander Graf <graf@amazon.com>
> ---
For hexagon,
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
> hw/arm/integratorcp.c | 3 ++-
> hw/arm/mps3r.c | 4 ++--
> hw/arm/realview.c | 3 ++-
> hw/arm/sbsa-ref.c | 4 ++--
> hw/arm/versatilepb.c | 3 ++-
> hw/arm/vexpress.c | 3 ++-
> hw/arm/virt.c | 4 ++--
> hw/arm/xilinx_zynq.c | 3 ++-
> hw/hexagon/hexagon_dsp.c | 5 +++--
> hw/hexagon/virt.c | 5 +++--
> hw/i386/x86-common.c | 9 ++++-----
> hw/i386/xen/xen-pvh.c | 5 ++---
> hw/loongarch/virt.c | 5 +++--
> hw/mips/cps.c | 5 +++--
> hw/ppc/e500.c | 5 +++--
> hw/ppc/spapr.c | 4 ++--
> hw/riscv/cps.c | 5 +++--
> hw/riscv/microblaze-v-generic.c | 3 ++-
> hw/s390x/s390-virtio-ccw.c | 16 +++++++---------
> hw/sparc/leon3.c | 3 ++-
> hw/sparc/sun4m.c | 5 +++--
> hw/sparc64/sparc64.c | 3 ++-
> 22 files changed, 58 insertions(+), 47 deletions(-)
>
> diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
> index 81c0bce8f9..30a6a940c5 100644
> --- a/hw/arm/integratorcp.c
> +++ b/hw/arm/integratorcp.c
> @@ -598,7 +598,8 @@ static void integratorcp_init(MachineState *machine)
> DriveInfo *dinfo;
> int i;
>
> - cpuobj = object_new(machine->cpu_type);
> + cpuobj = object_new_child(OBJECT(machine), "cpu[0]",
> + machine->cpu_type);
>
> /* By default ARM1176 CPUs have EL3 enabled. This board does not
> * currently support EL3 so the CPU EL3 property is disabled before
> diff --git a/hw/arm/mps3r.c b/hw/arm/mps3r.c
> index d6c29c1172..dd434eaefd 100644
> --- a/hw/arm/mps3r.c
> +++ b/hw/arm/mps3r.c
> @@ -388,13 +388,13 @@ static void mps3r_common_init(MachineState *machine)
> memory_region_add_subregion_overlap(&mms->cpu_sysmem[i], 0,
> &mms->sysmem_alias[i], -1);
>
> - mms->cpu[i] = object_new(machine->cpu_type);
> + mms->cpu[i] = object_new_child(OBJECT(mms), "cpu[*]",
> + machine->cpu_type);
> object_property_set_link(mms->cpu[i], "memory",
> OBJECT(&mms->cpu_sysmem[i]), &error_abort);
> object_property_set_int(mms->cpu[i], "reset-cbar",
> PERIPHBASE, &error_abort);
> qdev_realize(DEVICE(mms->cpu[i]), NULL, &error_fatal);
> - object_unref(mms->cpu[i]);
>
> /* Per-CPU RAM */
> memory_region_init_ram(&mms->cpu_ram[i], OBJECT(mms), ramname,
> diff --git a/hw/arm/realview.c b/hw/arm/realview.c
> index 99591e7d80..f938367131 100644
> --- a/hw/arm/realview.c
> +++ b/hw/arm/realview.c
> @@ -119,7 +119,8 @@ static void realview_init(MachineState *machine,
> }
>
> for (n = 0; n < smp_cpus; n++) {
> - Object *cpuobj = object_new(machine->cpu_type);
> + Object *cpuobj = object_new_child(OBJECT(machine), "cpu[*]",
> + machine->cpu_type);
>
> /* By default A9,A15 and ARM1176 CPUs have EL3 enabled. This board
> * does not currently support EL3 so the CPU EL3 property is disabled
> diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
> index c9adc972c1..3b759d9209 100644
> --- a/hw/arm/sbsa-ref.c
> +++ b/hw/arm/sbsa-ref.c
> @@ -783,7 +783,8 @@ static void sbsa_ref_init(MachineState *machine)
> break;
> }
>
> - cpuobj = object_new(possible_cpus->cpus[n].type);
> + cpuobj = object_new_child(OBJECT(sms), "cpu[*]",
> + possible_cpus->cpus[n].type);
> object_property_set_int(cpuobj, "mp-affinity",
> possible_cpus->cpus[n].arch_id, NULL);
>
> @@ -808,7 +809,6 @@ static void sbsa_ref_init(MachineState *machine)
> OBJECT(secure_sysmem), &error_abort);
>
> qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
> - object_unref(cpuobj);
> }
>
> memory_region_add_subregion(sysmem, sbsa_ref_memmap[SBSA_MEM].base,
> diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
> index f68c4765c6..8d93fff207 100644
> --- a/hw/arm/versatilepb.c
> +++ b/hw/arm/versatilepb.c
> @@ -208,7 +208,8 @@ static void versatile_init(MachineState *machine, int board_id)
> exit(1);
> }
>
> - cpuobj = object_new(machine->cpu_type);
> + cpuobj = object_new_child(OBJECT(machine), "cpu[0]",
> + machine->cpu_type);
>
> /* By default ARM1176 CPUs have EL3 enabled. This board does not
> * currently support EL3 so the CPU EL3 property is disabled before
> diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
> index f877ccf330..986525b9ce 100644
> --- a/hw/arm/vexpress.c
> +++ b/hw/arm/vexpress.c
> @@ -219,7 +219,8 @@ static void init_cpus(MachineState *ms, const char *cpu_type,
>
> /* Create the actual CPUs */
> for (n = 0; n < smp_cpus; n++) {
> - Object *cpuobj = object_new(cpu_type);
> + Object *cpuobj = object_new_child(qdev_get_machine(), "cpu[*]",
> + cpu_type);
>
> if (!secure) {
> object_property_set_bool(cpuobj, "has_el3", false, NULL);
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index f2249a0b72..95e087d692 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -3039,7 +3039,8 @@ static void machvirt_init(MachineState *machine)
> break;
> }
>
> - cpuobj = object_new(possible_cpus->cpus[n].type);
> + cpuobj = object_new_child(OBJECT(vms), "cpu[*]",
> + possible_cpus->cpus[n].type);
> object_property_set_int(cpuobj, "mp-affinity",
> possible_cpus->cpus[n].arch_id, NULL);
>
> @@ -3139,7 +3140,6 @@ static void machvirt_init(MachineState *machine)
> }
>
> qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
> - object_unref(cpuobj);
> }
>
> /* Now we've created the CPUs we can see if they have the hypvirt timer */
> diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
> index 441289e63f..a2dcdd422d 100644
> --- a/hw/arm/xilinx_zynq.c
> +++ b/hw/arm/xilinx_zynq.c
> @@ -222,7 +222,8 @@ static void zynq_init(MachineState *machine)
> }
>
> for (n = 0; n < smp_cpus; n++) {
> - Object *cpuobj = object_new(machine->cpu_type);
> + Object *cpuobj = object_new_child(OBJECT(machine), "cpu[*]",
> + machine->cpu_type);
>
> object_property_set_int(cpuobj, "midr", ZYNQ_BOARD_MIDR,
> &error_fatal);
> diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c
> index 53dfe6741e..d78a987dca 100644
> --- a/hw/hexagon/hexagon_dsp.c
> +++ b/hw/hexagon/hexagon_dsp.c
> @@ -143,7 +143,8 @@ static void hexagon_common_init(MachineState *machine, Rev_t rev,
> sysbus_realize(SYS_BUS_DEVICE(tlb_dev), &error_fatal);
>
> for (int i = 0; i < machine->smp.cpus; i++) {
> - HexagonCPU *cpu = HEXAGON_CPU(object_new(machine->cpu_type));
> + HexagonCPU *cpu = HEXAGON_CPU(object_new_child(OBJECT(machine), "cpu[*]",
> + machine->cpu_type));
> qemu_register_reset(do_cpu_reset, cpu);
>
> /*
> @@ -158,7 +159,7 @@ static void hexagon_common_init(MachineState *machine, Rev_t rev,
> OBJECT(glob_regs_dev), &error_fatal);
> object_property_set_link(OBJECT(cpu), "tlb",
> OBJECT(tlb_dev), &error_fatal);
> - qdev_realize_and_unref(DEVICE(cpu), NULL, &error_fatal);
> + qdev_realize(DEVICE(cpu), NULL, &error_fatal);
> }
>
> rom_add_blob_fixed_as("config_table.rom", &m_cfg->cfgtable,
> diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c
> index fb23cda19f..48f1e35dd3 100644
> --- a/hw/hexagon/virt.c
> +++ b/hw/hexagon/virt.c
> @@ -280,7 +280,8 @@ static void virt_init(MachineState *ms)
>
> cpu0 = NULL;
> for (int i = 0; i < ms->smp.cpus; i++) {
> - HexagonCPU *cpu = HEXAGON_CPU(object_new(ms->cpu_type));
> + HexagonCPU *cpu = HEXAGON_CPU(object_new_child(OBJECT(ms), "cpu[*]",
> + ms->cpu_type));
> qemu_register_reset(do_cpu_reset, cpu);
>
> if (i == 0) {
> @@ -300,7 +301,7 @@ static void virt_init(MachineState *ms)
> object_property_set_link(OBJECT(cpu), "tlb",
> OBJECT(tlb_dev), &error_fatal);
>
> - qdev_realize_and_unref(DEVICE(cpu), NULL, &error_fatal);
> + qdev_realize(DEVICE(cpu), NULL, &error_fatal);
> }
> fdt_add_cpu_nodes(vms);
> clk_phandle = fdt_add_clocks(vms);
> diff --git a/hw/i386/x86-common.c b/hw/i386/x86-common.c
> index 151a67ee5f..5bbfee737e 100644
> --- a/hw/i386/x86-common.c
> +++ b/hw/i386/x86-common.c
> @@ -55,15 +55,14 @@ static size_t pvh_start_addr;
>
> static void x86_cpu_new(X86MachineState *x86ms, int64_t apic_id, Error **errp)
> {
> - Object *cpu = object_new(MACHINE(x86ms)->cpu_type);
> + Object *cpu = object_new_child(OBJECT(x86ms), "cpu[*]",
> + MACHINE(x86ms)->cpu_type);
>
> if (!object_property_set_uint(cpu, "apic-id", apic_id, errp)) {
> - goto out;
> + object_unparent(cpu);
> + return;
> }
> qdev_realize(DEVICE(cpu), NULL, errp);
> -
> -out:
> - object_unref(cpu);
> }
>
> void x86_cpus_init(X86MachineState *x86ms, int default_cpu_version)
> diff --git a/hw/i386/xen/xen-pvh.c b/hw/i386/xen/xen-pvh.c
> index ab90c83a83..7aef48ad61 100644
> --- a/hw/i386/xen/xen-pvh.c
> +++ b/hw/i386/xen/xen-pvh.c
> @@ -29,12 +29,11 @@ struct XenPVHx86State {
> static DeviceState *xen_pvh_cpu_new(MachineState *ms,
> int64_t apic_id)
> {
> - Object *cpu = object_new(ms->cpu_type);
> + Object *cpu = object_new_child(OBJECT(ms), "cpu[*]",
> + ms->cpu_type);
>
> - object_property_add_child(OBJECT(ms), "cpu[*]", cpu);
> object_property_set_uint(cpu, "apic-id", apic_id, &error_fatal);
> qdev_realize(DEVICE(cpu), NULL, &error_fatal);
> - object_unref(cpu);
>
> return DEVICE(cpu);
> }
> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
> index 580ef0bb3e..b749aafdbe 100644
> --- a/hw/loongarch/virt.c
> +++ b/hw/loongarch/virt.c
> @@ -948,13 +948,14 @@ static void virt_init(MachineState *machine)
> /* Init CPUs */
> mc->possible_cpu_arch_ids(machine);
> for (i = 0; i < machine->smp.cpus; i++) {
> - cpuobj = object_new(machine->cpu_type);
> + cpuobj = object_new_child(OBJECT(machine), "cpu[*]",
> + machine->cpu_type);
> if (cpuobj == NULL) {
> error_report("Fail to create object with type %s ",
> machine->cpu_type);
> exit(EXIT_FAILURE);
> }
> - qdev_realize_and_unref(DEVICE(cpuobj), NULL, &error_fatal);
> + qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
> }
> virt_check_dmsi(machine);
> fw_cfg_add_memory(machine);
> diff --git a/hw/mips/cps.c b/hw/mips/cps.c
> index 620ee972f8..b997608373 100644
> --- a/hw/mips/cps.c
> +++ b/hw/mips/cps.c
> @@ -74,7 +74,8 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
> }
>
> for (int i = 0; i < s->num_vp; i++) {
> - MIPSCPU *cpu = MIPS_CPU(object_new(s->cpu_type));
> + MIPSCPU *cpu = MIPS_CPU(object_new_child(OBJECT(s), "cpu[*]",
> + s->cpu_type));
> CPUMIPSState *env = &cpu->env;
>
> object_property_set_bool(OBJECT(cpu), "big-endian", s->cpu_is_bigendian,
> @@ -87,7 +88,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
> /* All cores use the same clock tree */
> qdev_connect_clock_in(DEVICE(cpu), "clk-in", s->clock);
>
> - if (!qdev_realize_and_unref(DEVICE(cpu), NULL, errp)) {
> + if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
> return;
> }
>
> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
> index f3917c0755..a0eb25e956 100644
> --- a/hw/ppc/e500.c
> +++ b/hw/ppc/e500.c
> @@ -941,7 +941,8 @@ void ppce500_init(MachineState *machine)
> PowerPCCPU *cpu;
> CPUState *cs;
>
> - cpu = POWERPC_CPU(object_new(machine->cpu_type));
> + cpu = POWERPC_CPU(object_new_child(OBJECT(machine), "cpu[*]",
> + machine->cpu_type));
> env = &cpu->env;
> cs = CPU(cpu);
>
> @@ -956,7 +957,7 @@ void ppce500_init(MachineState *machine)
> */
> object_property_set_bool(OBJECT(cs), "start-powered-off", i != 0,
> &error_abort);
> - qdev_realize_and_unref(DEVICE(cs), NULL, &error_fatal);
> + qdev_realize(DEVICE(cs), NULL, &error_fatal);
>
> if (!firstenv) {
> firstenv = env;
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 9b6b5e7257..e6c1b7f0b1 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -2776,7 +2776,8 @@ static void spapr_init_cpus(SpaprMachineState *spapr)
> }
>
> if (i < boot_cores_nr) {
> - Object *core = object_new(type);
> + Object *core = object_new_child(OBJECT(spapr), "cpu-core[*]",
> + type);
> int nr_threads = smp_threads;
>
> /* Handle the partially filled core for older machine types */
> @@ -2790,7 +2791,6 @@ static void spapr_init_cpus(SpaprMachineState *spapr)
> &error_fatal);
> qdev_realize(DEVICE(core), NULL, &error_fatal);
>
> - object_unref(core);
> }
> }
> }
> diff --git a/hw/riscv/cps.c b/hw/riscv/cps.c
> index b6b30e05e1..2bf506b61a 100644
> --- a/hw/riscv/cps.c
> +++ b/hw/riscv/cps.c
> @@ -63,13 +63,14 @@ static void riscv_cps_realize(DeviceState *dev, Error **errp)
> int harts_in_cluster = s->num_hart * s->num_core;
> int num_of_clusters = s->num_vp / harts_in_cluster;
> for (i = 0; i < s->num_vp; i++) {
> - cpu = RISCV_CPU(object_new(s->cpu_type));
> + cpu = RISCV_CPU(object_new_child(OBJECT(s), "cpu[*]",
> + s->cpu_type));
>
> /* All VPs are halted on reset. Leave powering up to CPC. */
> object_property_set_bool(OBJECT(cpu), "start-powered-off", true,
> &error_abort);
>
> - if (!qdev_realize_and_unref(DEVICE(cpu), NULL, errp)) {
> + if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
> return;
> }
>
> diff --git a/hw/riscv/microblaze-v-generic.c b/hw/riscv/microblaze-v-generic.c
> index 0a83932405..f97ce402e6 100644
> --- a/hw/riscv/microblaze-v-generic.c
> +++ b/hw/riscv/microblaze-v-generic.c
> @@ -65,7 +65,8 @@ static void mb_v_generic_init(MachineState *machine)
> qemu_irq irq[32];
> MemoryRegion *sysmem = get_system_memory();
>
> - cpu = RISCV_CPU(object_new(machine->cpu_type));
> + cpu = RISCV_CPU(object_new_child(OBJECT(machine), "cpu[0]",
> + machine->cpu_type));
> object_property_set_bool(OBJECT(cpu), "h", false, NULL);
> object_property_set_bool(OBJECT(cpu), "d", false, NULL);
> qdev_realize(DEVICE(cpu), NULL, &error_abort);
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index 037cb6eb5e..0625d4a8df 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -56,20 +56,18 @@ static Error *pv_mig_blocker;
> static S390CPU *s390x_new_cpu(const char *typename, uint32_t core_id,
> Error **errp)
> {
> - S390CPU *cpu = S390_CPU(object_new(typename));
> - S390CPU *ret = NULL;
> + S390CPU *cpu = S390_CPU(object_new_child(qdev_get_machine(), "cpu[*]",
> + typename));
>
> if (!object_property_set_int(OBJECT(cpu), "core-id", core_id, errp)) {
> - goto out;
> + object_unparent(OBJECT(cpu));
> + return NULL;
> }
> if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
> - goto out;
> + object_unparent(OBJECT(cpu));
> + return NULL;
> }
> - ret = cpu;
> -
> -out:
> - object_unref(OBJECT(cpu));
> - return ret;
> + return cpu;
> }
>
> static void s390_init_cpus(MachineState *machine)
> diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
> index f9ef2758e1..a2781bcc32 100644
> --- a/hw/sparc/leon3.c
> +++ b/hw/sparc/leon3.c
> @@ -278,7 +278,8 @@ static void leon3_generic_hw_init(MachineState *machine)
>
> for (i = 0; i < machine->smp.cpus; i++) {
> /* Init CPU */
> - cpu = SPARC_CPU(object_new(machine->cpu_type));
> + cpu = SPARC_CPU(object_new_child(OBJECT(machine), "cpu[*]",
> + machine->cpu_type));
> qdev_init_gpio_in_named(DEVICE(cpu), leon3_start_cpu, "start_cpu", 1);
> qdev_init_gpio_in_named(DEVICE(cpu), leon3_set_pil_in, "pil", 1);
> qdev_realize(DEVICE(cpu), NULL, &error_fatal);
> diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
> index 51f5468a02..1ae9d834ca 100644
> --- a/hw/sparc/sun4m.c
> +++ b/hw/sparc/sun4m.c
> @@ -787,7 +787,8 @@ static DeviceState *cpu_devinit(const char *cpu_type, unsigned int id,
> CPUSPARCState *env;
> DeviceState *cpudev;
>
> - cpu = SPARC_CPU(object_new(cpu_type));
> + cpu = SPARC_CPU(object_new_child(qdev_get_machine(), "cpu[*]",
> + cpu_type));
> env = &cpu->env;
> cpudev = DEVICE(cpu);
>
> @@ -795,7 +796,7 @@ static DeviceState *cpu_devinit(const char *cpu_type, unsigned int id,
> object_property_set_bool(OBJECT(cpu), "start-powered-off", id != 0,
> &error_abort);
> qdev_init_gpio_in_named(cpudev, cpu_set_irq, "pil", MAX_PILS);
> - qdev_realize_and_unref(cpudev, NULL, &error_fatal);
> + qdev_realize(cpudev, NULL, &error_fatal);
> cpu_sparc_set_id(env, id);
> env->prom_addr = prom_addr;
> return cpudev;
> diff --git a/hw/sparc64/sparc64.c b/hw/sparc64/sparc64.c
> index 16f4aa052b..9092c4193e 100644
> --- a/hw/sparc64/sparc64.c
> +++ b/hw/sparc64/sparc64.c
> @@ -272,7 +272,8 @@ SPARCCPU *sparc64_cpu_devinit(const char *cpu_type, uint64_t prom_addr)
> uint32_t stick_frequency = 100 * 1000000;
> uint32_t hstick_frequency = 100 * 1000000;
>
> - cpu = SPARC_CPU(object_new(cpu_type));
> + cpu = SPARC_CPU(object_new_child(qdev_get_machine(), "cpu[0]",
> + cpu_type));
> qdev_init_gpio_in_named(DEVICE(cpu), sparc64_cpu_set_ivec_irq,
> "ivec-irq", IVEC_MAX);
> qdev_realize(DEVICE(cpu), NULL, &error_fatal);
> --
> 2.47.1
>
^ permalink raw reply [flat|nested] 156+ messages in thread
* [RFC PATCH 130/134] hw/pci-host/versatile: Use object_initialize_child() for pci_dev
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (128 preceding siblings ...)
2026-07-11 22:37 ` [RFC PATCH 129/134] hw: Parent board-created CPUs under the machine Alexander Graf
@ 2026-07-11 22:37 ` Alexander Graf
2026-07-11 22:37 ` [RFC PATCH 131/134] docs, qapi, scripts, iotests: Update /machine/unattached path references Alexander Graf
` (4 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:37 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
The embedded versatile_pci_host device was initialized via
object_initialize() without ever being parented, so it landed in
/machine/unattached at realize time. Switch to
object_initialize_child() so it becomes a proper child<> of the
host bridge.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/pci-host/versatile.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/pci-host/versatile.c b/hw/pci-host/versatile.c
index b27531f7fb..b749bcf1a1 100644
--- a/hw/pci-host/versatile.c
+++ b/hw/pci-host/versatile.c
@@ -410,7 +410,8 @@ static void pci_vpb_realize(DeviceState *dev, Error **errp)
PCI_DEVFN(11, 0), TYPE_PCI_BUS);
h->bus = &s->pci_bus;
- object_initialize(&s->pci_dev, sizeof(s->pci_dev), TYPE_VERSATILE_PCI_HOST);
+ object_initialize_child(OBJECT(s), "pci-host", &s->pci_dev,
+ TYPE_VERSATILE_PCI_HOST);
for (i = 0; i < 4; i++) {
sysbus_init_irq(sbd, &s->irq[i]);
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 131/134] docs, qapi, scripts, iotests: Update /machine/unattached path references
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (129 preceding siblings ...)
2026-07-11 22:37 ` [RFC PATCH 130/134] hw/pci-host/versatile: Use object_initialize_child() for pci_dev Alexander Graf
@ 2026-07-11 22:37 ` Alexander Graf
2026-07-11 22:37 ` [RFC PATCH 132/134] qom: Delete /machine/unattached and error on unparented realize Alexander Graf
` (3 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:37 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Board-created devices no longer land in /machine/unattached and the
next commit removes the container entirely. Update the in-tree
consumers of the old paths:
scripts/arm_processor_error.py, scripts/qmp_helper.py
Search for CPUs directly under /machine.
docs/devel/s390-cpu-topology.rst, docs/system/cpu-hotplug.rst
qapi/{block-core,block,machine,qom}.json
Refresh example qom-path strings.
tests/qemu-iotests/common.filter
_filter_qom_path() now normalizes any /machine/... device path
so the reference outputs are stable across board naming changes.
tests/qemu-iotests/{172,186}.out
Regenerated against the new filter.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
docs/devel/s390-cpu-topology.rst | 2 +-
docs/system/cpu-hotplug.rst | 4 +-
qapi/block-core.json | 12 +++---
qapi/block.json | 2 +-
qapi/machine.json | 12 +++---
qapi/qom.json | 4 +-
scripts/arm_processor_error.py | 3 +-
scripts/qmp_helper.py | 2 +-
tests/qemu-iotests/172.out | 72 ++++++++++++++++----------------
tests/qemu-iotests/186.out | 10 ++---
tests/qemu-iotests/common.filter | 2 +-
11 files changed, 62 insertions(+), 63 deletions(-)
diff --git a/docs/devel/s390-cpu-topology.rst b/docs/devel/s390-cpu-topology.rst
index 48313b92d4..26be230969 100644
--- a/docs/devel/s390-cpu-topology.rst
+++ b/docs/devel/s390-cpu-topology.rst
@@ -40,7 +40,7 @@ modifiers for all configured vCPUs.
},
"cpu-state": "operating",
"entitlement": "medium",
- "qom-path": "/machine/unattached/device[0]",
+ "qom-path": "/machine/cpu[0]",
"cpu-index": 0,
"target": "s390x"
},
diff --git a/docs/system/cpu-hotplug.rst b/docs/system/cpu-hotplug.rst
index cc50937c36..f838faba6f 100644
--- a/docs/system/cpu-hotplug.rst
+++ b/docs/system/cpu-hotplug.rst
@@ -47,7 +47,7 @@ vCPU hotplug
"socket-id": 0,
"thread-id": 0
},
- "qom-path": "/machine/unattached/device[0]",
+ "qom-path": "/machine/cpu[0]",
"type": "IvyBridge-IBRS-x86_64-cpu",
"vcpus-count": 1
}
@@ -95,7 +95,7 @@ vCPU hotplug
"socket-id": 0,
"thread-id": 0
},
- "qom-path": "/machine/unattached/device[0]",
+ "qom-path": "/machine/cpu[0]",
"target": "x86_64",
"thread-id": 28957
},
diff --git a/qapi/block-core.json b/qapi/block-core.json
index 1f87b07850..28487f7cae 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -928,7 +928,7 @@
# "device":"ide1-cd0",
# "locked":false,
# "removable":true,
-# "qdev": "/machine/unattached/device[23]",
+# "qdev": "/machine/ide[1]/ide.1/cd0",
# "tray_open": false,
# "type":"unknown"
# },
@@ -936,7 +936,7 @@
# "device":"floppy0",
# "locked":false,
# "removable":true,
-# "qdev": "/machine/unattached/device[20]",
+# "qdev": "/machine/fdc/floppy[0]",
# "type":"unknown"
# },
# {
@@ -1310,7 +1310,7 @@
# "account_invalid":true,
# "account_failed":false
# },
-# "qdev": "/machine/unattached/device[23]"
+# "qdev": "/machine/ide[0]/ide.0/hd0"
# },
# {
# "device":"ide1-cd0",
@@ -1329,7 +1329,7 @@
# "account_invalid":false,
# "account_failed":false
# },
-# "qdev": "/machine/unattached/device[24]"
+# "qdev": "/machine/ide[1]/ide.1/cd0"
# },
# {
# "device":"floppy0",
@@ -1348,7 +1348,7 @@
# "account_invalid":false,
# "account_failed":false
# },
-# "qdev": "/machine/unattached/device[16]"
+# "qdev": "/machine/fdc/floppy[0]"
# },
# {
# "device":"sd0",
@@ -5750,7 +5750,7 @@
# .. qmp-example::
#
# <- { "event": "BLOCK_IO_ERROR",
-# "data": { "qom-path": "/machine/unattached/device[0]",
+# "data": { "qom-path": "/machine/ide[0]/ide.0/hd1",
# "device": "ide0-hd1",
# "node-name": "#block212",
# "operation": "write",
diff --git a/qapi/block.json b/qapi/block.json
index 46955bbb3e..cb177180e7 100644
--- a/qapi/block.json
+++ b/qapi/block.json
@@ -404,7 +404,7 @@
#
# <- { "event": "DEVICE_TRAY_MOVED",
# "data": { "device": "ide1-cd0",
-# "id": "/machine/unattached/device[22]",
+# "id": "/machine/ide[1]/ide.1/cd0",
# "tray-open": true
# },
# "timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
diff --git a/qapi/machine.json b/qapi/machine.json
index 9b2248038f..2d39d650ce 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
@@ -121,7 +121,7 @@
# "thread-id": 0,
# "socket-id": 0
# },
-# "qom-path": "/machine/unattached/device[0]",
+# "qom-path": "/machine/cpu[0]",
# "target":"x86_64",
# "cpu-index": 0
# },
@@ -132,7 +132,7 @@
# "thread-id": 0,
# "socket-id": 1
# },
-# "qom-path": "/machine/unattached/device[2]",
+# "qom-path": "/machine/cpu[1]",
# "target":"x86_64",
# "cpu-index": 1
# }
@@ -1028,7 +1028,7 @@
# { "props": { "core-id": 8 }, "type": "POWER8-spapr-cpu-core",
# "vcpus-count": 1 },
# { "props": { "core-id": 0 }, "type": "POWER8-spapr-cpu-core",
-# "vcpus-count": 1, "qom-path": "/machine/unattached/device[0]"}
+# "vcpus-count": 1, "qom-path": "/machine/cpu[0]"}
# ]}
#
# .. qmp-example::
@@ -1043,7 +1043,7 @@
# "props": {"core-id": 0, "socket-id": 1, "thread-id": 0}
# },
# {
-# "qom-path": "/machine/unattached/device[0]",
+# "qom-path": "/machine/cpu[0]",
# "type": "qemu64-x86_64-cpu", "vcpus-count": 1,
# "props": {"core-id": 0, "socket-id": 0, "thread-id": 0}
# }
@@ -1062,7 +1062,7 @@
# "props": { "core-id": 1 }
# },
# {
-# "qom-path": "/machine/unattached/device[0]",
+# "qom-path": "/machine/cpu[0]",
# "type": "qemu-s390x-cpu", "vcpus-count": 1,
# "props": { "core-id": 0 }
# }
@@ -1617,7 +1617,7 @@
#
# <- { "event": "MEMORY_DEVICE_SIZE_CHANGE",
# "data": { "id": "vm0", "size": 1073741824,
-# "qom-path": "/machine/unattached/device[2]" },
+# "qom-path": "/machine/peripheral/vm0" },
# "timestamp": { "seconds": 1588168529, "microseconds": 201316 } }
##
{ 'event': 'MEMORY_DEVICE_SIZE_CHANGE',
diff --git a/qapi/qom.json b/qapi/qom.json
index d96cc5aa21..62f9fd5492 100644
--- a/qapi/qom.json
+++ b/qapi/qom.json
@@ -135,7 +135,7 @@
# :title: Use absolute path
#
# -> { "execute": "qom-get",
-# "arguments": { "path": "/machine/unattached/device[0]",
+# "arguments": { "path": "/machine/cpu[0]",
# "property": "hotplugged" } }
# <- { "return": false }
#
@@ -143,7 +143,7 @@
# :title: Use partial path
#
# -> { "execute": "qom-get",
-# "arguments": { "path": "unattached/sysbus",
+# "arguments": { "path": "machine/sysbus",
# "property": "type" } }
# <- { "return": "System" }
##
diff --git a/scripts/arm_processor_error.py b/scripts/arm_processor_error.py
index 73d069f070..2636837ce3 100644
--- a/scripts/arm_processor_error.py
+++ b/scripts/arm_processor_error.py
@@ -244,8 +244,7 @@ def send_cper(self, args):
qmp_cmd.set_args(args)
is_cpu_type = re.compile(r"^([\w+]+\-)?arm\-cpu$")
- cpus = qmp_cmd.search_qom("/machine/unattached/device",
- "type", is_cpu_type)
+ cpus = qmp_cmd.search_qom("/machine/cpu", "type", is_cpu_type)
cper = {}
pei = {}
diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py
index 521612fb94..b7e9ad86b9 100755
--- a/scripts/qmp_helper.py
+++ b/scripts/qmp_helper.py
@@ -601,7 +601,7 @@ def search_qom(self, path, prop, regex):
"""
Return a list of devices that match path array like:
- /machine/unattached/device
+ /machine/cpu
/machine/peripheral-anon/device
...
"""
diff --git a/tests/qemu-iotests/172.out b/tests/qemu-iotests/172.out
index a023cd407d..b2adec97c8 100644
--- a/tests/qemu-iotests/172.out
+++ b/tests/qemu-iotests/172.out
@@ -63,12 +63,12 @@ Testing: -fda TEST_DIR/t.qcow2
stats-intervals = <null>
drive-type = "144"
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -115,16 +115,16 @@ Testing: -fdb TEST_DIR/t.qcow2
stats-intervals = <null>
drive-type = "288"
floppy1 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
floppy0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -171,17 +171,17 @@ Testing: -fda TEST_DIR/t.qcow2 -fdb TEST_DIR/t.qcow2.2
stats-intervals = <null>
drive-type = "144"
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
floppy1 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -258,12 +258,12 @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2
stats-intervals = <null>
drive-type = "144"
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -310,16 +310,16 @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2,index=1
stats-intervals = <null>
drive-type = "288"
floppy1 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
floppy0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -366,17 +366,17 @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=floppy,file=TEST_DIR/t
stats-intervals = <null>
drive-type = "144"
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
floppy1 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -416,7 +416,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -453,7 +453,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -510,7 +510,7 @@ none1 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -566,7 +566,7 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
stats-intervals = <null>
drive-type = "144"
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
@@ -576,7 +576,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -623,7 +623,7 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
stats-intervals = <null>
drive-type = "144"
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
@@ -633,7 +633,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -680,7 +680,7 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
stats-intervals = <null>
drive-type = "144"
floppy1 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
@@ -690,7 +690,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -737,7 +737,7 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
stats-intervals = <null>
drive-type = "144"
floppy1 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
@@ -747,7 +747,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -803,7 +803,7 @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.q
stats-intervals = <null>
drive-type = "144"
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
@@ -813,7 +813,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -860,7 +860,7 @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.q
stats-intervals = <null>
drive-type = "144"
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
@@ -870,7 +870,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -913,7 +913,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -1091,7 +1091,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -1128,7 +1128,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -1168,7 +1168,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -1205,7 +1205,7 @@ none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
Cache mode: writeback
ide1-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
diff --git a/tests/qemu-iotests/186.out b/tests/qemu-iotests/186.out
index 01530040e5..a2fdb0a915 100644
--- a/tests/qemu-iotests/186.out
+++ b/tests/qemu-iotests/186.out
@@ -404,7 +404,7 @@ Testing: -drive if=floppy
QEMU X.Y.Z monitor - type 'help' for more information
(qemu) info block
floppy0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -412,7 +412,7 @@ Testing: -drive if=floppy,driver=null-co,read-zeroes=on
QEMU X.Y.Z monitor - type 'help' for more information
(qemu) info block
floppy0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
(qemu) quit
@@ -421,7 +421,7 @@ Testing: -drive if=ide,driver=null-co,read-zeroes=on
QEMU X.Y.Z monitor - type 'help' for more information
(qemu) info block
ide0-hd0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Cache mode: writeback
(qemu) quit
@@ -429,7 +429,7 @@ Testing: -drive if=ide,media=cdrom
QEMU X.Y.Z monitor - type 'help' for more information
(qemu) info block
ide0-cd0: [not inserted]
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
(qemu) quit
@@ -437,7 +437,7 @@ Testing: -drive if=ide,driver=null-co,read-zeroes=on,media=cdrom
QEMU X.Y.Z monitor - type 'help' for more information
(qemu) info block
ide0-cd0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co"} (null-co, read-only)
- Attached to: /machine/unattached/device[N]
+ Attached to: PATH
Removable device: not locked, tray closed
Cache mode: writeback
(qemu) quit
diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter
index ce4213cb97..9a5994a3a5 100644
--- a/tests/qemu-iotests/common.filter
+++ b/tests/qemu-iotests/common.filter
@@ -37,7 +37,7 @@ _filter_generated_node_ids()
_filter_qom_path()
{
- gsed -e '/Attached to:/s/\device[[0-9]\+\]/device[N]/g'
+ gsed -e '/Attached to:/s#/machine/.*#PATH#'
}
# replace occurrences of the actual TEST_DIR value with TEST_DIR
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 132/134] qom: Delete /machine/unattached and error on unparented realize
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (130 preceding siblings ...)
2026-07-11 22:37 ` [RFC PATCH 131/134] docs, qapi, scripts, iotests: Update /machine/unattached path references Alexander Graf
@ 2026-07-11 22:37 ` Alexander Graf
2026-07-11 22:37 ` [RFC PATCH 133/134] docs/devel/qom: Document the composition-tree parenting contract Alexander Graf
` (2 subsequent siblings)
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:37 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
With every board-created device, memory region, IRQ, and singleton
now given an explicit QOM parent, the /machine/unattached container
serves no legitimate purpose. Remove it and turn the
device_set_realized() fallback into a hard error, so that any
future orphan is caught at realize time rather than silently
adopted into an anonymous bucket.
hw/core/qdev.c error out on !obj->parent instead of adopting
hw/core/qdev-user.c drop the fake unattached container
system/vl.c drop "unattached" from machine container list
hw/i386/pc.c search /machine recursively for the FDC instead
of the (unattached, peripheral, peripheral-anon)
container triple
tests/unit/ parent test devices explicitly under /machine
After this commit, `info qom-tree` no longer shows
/machine/unattached on any target/machine combination, and
`git grep '"unattached"'` returns zero hits.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
hw/core/qdev-user.c | 6 +-----
hw/core/qdev.c | 20 ++++----------------
hw/i386/pc.c | 11 +----------
include/hw/core/qdev.h | 2 +-
system/vl.c | 1 -
tests/unit/test-qdev-global-props.c | 17 +++++++----------
tests/unit/test-qdev.c | 12 ++++--------
7 files changed, 18 insertions(+), 51 deletions(-)
diff --git a/hw/core/qdev-user.c b/hw/core/qdev-user.c
index 051f8fbd02..592a8369a3 100644
--- a/hw/core/qdev-user.c
+++ b/hw/core/qdev-user.c
@@ -11,9 +11,5 @@
void qdev_create_fake_machine(void)
{
- Object *fake_machine_obj;
-
- fake_machine_obj = object_property_add_new_container(object_get_root(),
- "machine");
- object_property_add_new_container(fake_machine_obj, "unattached");
+ object_property_add_new_container(object_get_root(), "machine");
}
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 44a44862fd..7d7d08733d 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -485,8 +485,6 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
BusState *bus;
NamedClockList *ncl;
Error *local_err = NULL;
- bool unattached_parent = false;
- static int unattached_count;
if (dev->hotplugged && !dc->hotpluggable) {
error_setg(errp, "Device '%s' does not support hotplugging",
@@ -500,12 +498,10 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
}
if (!obj->parent) {
- gchar *name = g_strdup_printf("device[%d]", unattached_count++);
-
- object_property_add_child(machine_get_container("unattached"),
- name, obj);
- unattached_parent = true;
- g_free(name);
+ error_setg(errp, "device type '%s' has no QOM parent; "
+ "use qdev_new() with a parent",
+ object_get_typename(obj));
+ return;
}
hotplug_ctrl = qdev_get_hotplug_handler(dev);
@@ -633,14 +629,6 @@ post_realize_fail:
fail:
error_propagate(errp, local_err);
- if (unattached_parent) {
- /*
- * Beware, this doesn't just revert
- * object_property_add_child(), it also runs bus_remove()!
- */
- object_unparent(OBJECT(dev));
- unattached_count--;
- }
}
static bool device_get_hotpluggable(Object *obj, Error **errp)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 398371ff6f..bab8ee453f 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -368,24 +368,15 @@ static int check_fdc(Object *obj, void *opaque)
return 0;
}
-static const char * const fdc_container_path[] = {
- "unattached", "peripheral", "peripheral-anon"
-};
-
/*
* Locate the FDC at IO address 0x3f0, in order to configure the CMOS registers
* and ACPI objects.
*/
static ISADevice *pc_find_fdc0(void)
{
- int i;
- Object *container;
CheckFdcState state = { 0 };
- for (i = 0; i < ARRAY_SIZE(fdc_container_path); i++) {
- container = machine_get_container(fdc_container_path[i]);
- object_child_foreach(container, check_fdc, &state);
- }
+ object_child_foreach_recursive(qdev_get_machine(), check_fdc, &state);
if (state.multiple) {
warn_report("multiple floppy disk controllers with "
diff --git a/include/hw/core/qdev.h b/include/hw/core/qdev.h
index 9220e9e3b1..eded1b715d 100644
--- a/include/hw/core/qdev.h
+++ b/include/hw/core/qdev.h
@@ -462,7 +462,7 @@ static inline bool qdev_is_realized(DeviceState *dev)
* initialization.
* @dev must not be plugged into a bus already.
* If @bus, plug @dev into @bus. This takes a reference to @dev.
- * If @dev has no QOM parent, make one up, taking another reference.
+ * @dev must already have a QOM parent (see qdev_new()).
*
* If you created @dev via object_new() directly (holding a floating
* reference), you probably want to use qdev_realize_and_unref() instead.
diff --git a/system/vl.c b/system/vl.c
index b4434839df..e51399d389 100644
--- a/system/vl.c
+++ b/system/vl.c
@@ -2192,7 +2192,6 @@ static void parse_memory_options(void)
static void qemu_create_machine_containers(Object *machine)
{
static const char *const containers[] = {
- "unattached",
"peripheral",
"peripheral-anon",
};
diff --git a/tests/unit/test-qdev-global-props.c b/tests/unit/test-qdev-global-props.c
index 8ea362cbb9..a941774b9d 100644
--- a/tests/unit/test-qdev-global-props.c
+++ b/tests/unit/test-qdev-global-props.c
@@ -78,25 +78,22 @@ static const TypeInfo subclass_type = {
* inherit the global states of the parent process) will try to create qdev
* and realize the device.
*
- * Realization of such anonymous qdev (with no parent object) requires both
- * the machine object and its "unattached" container to be at least present.
+ * Realization requires that the device already has a QOM parent.
*/
static void test_init_machine(void)
{
/* This is a fake machine - it doesn't need to be a machine object */
- Object *machine = object_property_add_new_container(
+ object_property_add_new_container(
object_get_root(), "machine");
- /* This container must exist for anonymous qdevs to realize() */
- object_property_add_new_container(machine, "unattached");
-}
+ }
/* Test simple static property setting to default value */
static void test_static_prop_subprocess(void)
{
MyType *mt;
- mt = STATIC_TYPE(object_new(TYPE_STATIC_PROPS));
+ mt = STATIC_TYPE(object_new_child(qdev_get_machine(), "dev[*]", TYPE_STATIC_PROPS));
qdev_realize(DEVICE(mt), NULL, &error_fatal);
g_assert_cmpuint(mt->prop1, ==, PROP_DEFAULT);
@@ -131,7 +128,7 @@ static void test_static_globalprop_subprocess(void)
register_global_properties(props);
- mt = STATIC_TYPE(object_new(TYPE_STATIC_PROPS));
+ mt = STATIC_TYPE(object_new_child(qdev_get_machine(), "dev[*]", TYPE_STATIC_PROPS));
qdev_realize(DEVICE(mt), NULL, &error_fatal);
g_assert_cmpuint(mt->prop1, ==, 200);
@@ -249,7 +246,7 @@ static void test_dynamic_globalprop_subprocess(void)
register_global_properties(props);
- mt = DYNAMIC_TYPE(object_new(TYPE_DYNAMIC_PROPS));
+ mt = DYNAMIC_TYPE(object_new_child(qdev_get_machine(), "dev[*]", TYPE_DYNAMIC_PROPS));
qdev_realize(DEVICE(mt), NULL, &error_fatal);
g_assert_cmpuint(mt->prop1, ==, 101);
@@ -295,7 +292,7 @@ static void test_subclass_global_props(void)
register_global_properties(props);
- mt = STATIC_TYPE(object_new(TYPE_SUBCLASS));
+ mt = STATIC_TYPE(object_new_child(qdev_get_machine(), "dev[*]", TYPE_SUBCLASS));
qdev_realize(DEVICE(mt), NULL, &error_fatal);
g_assert_cmpuint(mt->prop1, ==, 102);
diff --git a/tests/unit/test-qdev.c b/tests/unit/test-qdev.c
index 20eae38e03..eafffb7175 100644
--- a/tests/unit/test-qdev.c
+++ b/tests/unit/test-qdev.c
@@ -44,24 +44,21 @@ static const TypeInfo my_dev_type_info = {
/*
* Initialize a fake machine, being prepared for future tests.
*
- * Realization of anonymous qdev (with no parent object) requires both
- * the machine object and its "unattached" container to be at least present.
+ * Realization requires that the device already has a QOM parent.
*/
static void test_init_machine(void)
{
/* This is a fake machine - it doesn't need to be a machine object */
- Object *machine = object_property_add_new_container(
+ object_property_add_new_container(
object_get_root(), "machine");
- /* This container must exist for anonymous qdevs to realize() */
- object_property_add_new_container(machine, "unattached");
-}
+ }
static void test_qdev_free_properties(void)
{
MyDev *mt;
- mt = STATIC_TYPE(object_new(TYPE_MY_DEV));
+ mt = STATIC_TYPE(object_new_child(qdev_get_machine(), "dev[*]", TYPE_MY_DEV));
object_set_props(OBJECT(mt), &error_fatal,
"string", "something",
"array-u32", "12,13",
@@ -75,7 +72,6 @@ static void test_qdev_free_properties(void)
g_assert_cmpuint(mt->prop_array_u32[1], ==, 13);
object_unparent(OBJECT(mt));
- object_unref(mt);
}
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 133/134] docs/devel/qom: Document the composition-tree parenting contract
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (131 preceding siblings ...)
2026-07-11 22:37 ` [RFC PATCH 132/134] qom: Delete /machine/unattached and error on unparented realize Alexander Graf
@ 2026-07-11 22:37 ` Alexander Graf
2026-07-11 22:37 ` [RFC PATCH 134/134] MAINTAINERS: Add scripts/coccinelle/qom-parent/ under QOM Alexander Graf
2026-07-12 10:56 ` [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Bernhard Beschow
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:37 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Add a section to the QOM developer documentation explaining that
every object must have a composition-tree parent before use, how
to pick the parent (creator owns lifetime), how to name children,
the reference-count contract for parented creators, and where the
contract is enforced (device_set_realized, memory_region_do_init,
qdev_connect_gpio_out_named).
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
docs/devel/qom.rst | 96 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 96 insertions(+)
diff --git a/docs/devel/qom.rst b/docs/devel/qom.rst
index 935bb1004a..ffcb3333b5 100644
--- a/docs/devel/qom.rst
+++ b/docs/devel/qom.rst
@@ -27,6 +27,102 @@ that make up a QEMU "machine". You can view this tree by running
objects created by the machine itself as well those created due to
user configuration.
+Composition-tree parenting contract
+====================================
+
+Every QOM object that participates in the running system must have a
+composition-tree parent before it is used. The parent gives the object
+a stable, canonical path such as ``/machine/soc/uart[0]`` that is
+visible in ``info qom-tree`` and addressable via ``qom-get`` and
+``qom-set``. Objects that reach ``realize`` (for devices), that are
+wired to another object (for IRQ lines), or that are given a name (for
+memory regions) without a parent are programming errors.
+
+Creating parented objects
+-------------------------
+
+The standard creation helpers all take the composition-tree parent and
+the child name as their first two arguments:
+
+.. code-block:: c
+
+ Object *object_new_child(Object *parent, const char *id,
+ const char *typename);
+ DeviceState *qdev_new(Object *parent, const char *id,
+ const char *typename);
+ DeviceState *sysbus_create_simple(Object *parent, const char *id,
+ const char *type, hwaddr, qemu_irq);
+ PCIDevice *pci_new(Object *parent, const char *id, ...);
+ ISADevice *isa_new(Object *parent, const char *id, ...);
+ /* i2c_slave_new(), ssi_create_peripheral(), usb_new(),
+ cpu_create() etc. follow the same pattern. */
+
+``object_new()`` remains available as the primitive allocator for
+transient introspection objects and for ``qdev_device_add()``, which
+parents the device via ``qdev_set_id()``. All other callers should use
+one of the parented helpers above, or ``object_initialize_child()`` for
+objects that are embedded by value in the parent's instance struct.
+
+Choosing the parent
+-------------------
+
+The QOM parent is the object that owns the child's lifetime. In
+practice this is the object whose code is creating the child:
+
+* Board code (``MachineClass.init``) parents onboard devices to the
+ machine: ``OBJECT(machine)``.
+* A composite device's ``DeviceClass.realize`` parents the sub-devices
+ it creates to itself: ``OBJECT(dev)``.
+* An SoC container likewise parents the devices it creates to the SoC
+ object.
+
+The bus a device is plugged into is *not* its composition-tree parent.
+A device may sit on a bus owned by ``B`` without being a child of
+``B``; the bus relationship is expressed through the ``parent_bus``
+link, not the ``child<>`` property.
+
+Choosing the child name
+-----------------------
+
+* A single instance takes a bare noun: ``"uart"``, ``"gic"``, ``"rtc"``.
+* A fixed number of identical instances take an explicit index:
+ ``"uart[0]"``, ``"uart[1]"``.
+* When the caller does not care about the index, ``"uart[*]"`` lets
+ QOM allocate the next free slot in the ``uart[]`` array.
+* Address-based names such as ``"eth@0x30000000"`` should only be used
+ when the address is genuinely the identity of the device.
+
+Child names share the parent's property namespace, so avoid names that
+collide with class-defined properties of the parent (in particular,
+machine class properties visible on ``/machine``).
+
+Reference-count contract
+------------------------
+
+``object_new_child()``, ``qdev_new()`` and the per-bus creators return
+with the object's single reference held by the parent's ``child<>``
+property. The caller does *not* hold a reference of its own and must
+therefore pair creation with plain ``qdev_realize()`` rather than
+``qdev_realize_and_unref()``. The object is finalized when the parent
+drops its ``child<>`` property, typically via ``object_unparent()``.
+
+Enforcement
+-----------
+
+The parenting contract is enforced at the points where an unparented
+object would first become visible or entangled with another object:
+
+* ``device_set_realized()`` fails with an ``Error`` if the device has
+ no composition-tree parent.
+* ``memory_region_do_init()`` asserts that a memory region given a
+ non-empty name also has an owner.
+* ``qdev_connect_gpio_out_named()`` asserts that the outbound IRQ
+ line being connected already has a composition-tree parent.
+
+There is no ``/machine/unattached`` fallback container; an object that
+would previously have landed there now triggers one of the errors
+above instead.
+
Creating a QOM class
====================
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* [RFC PATCH 134/134] MAINTAINERS: Add scripts/coccinelle/qom-parent/ under QOM
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (132 preceding siblings ...)
2026-07-11 22:37 ` [RFC PATCH 133/134] docs/devel/qom: Document the composition-tree parenting contract Alexander Graf
@ 2026-07-11 22:37 ` Alexander Graf
2026-07-12 10:56 ` [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Bernhard Beschow
134 siblings, 0 replies; 156+ messages in thread
From: Alexander Graf @ 2026-07-11 22:37 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Bernhard Beschow, Stafford Horne,
Sergio Lopez, Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
The Coccinelle scripts used to perform the tree-wide *_orphan()
renames are stored under scripts/coccinelle/qom-parent/. Add the
directory to the QOM MAINTAINERS entry.
Assisted-by: Kiro
Signed-off-by: Alexander Graf <graf@amazon.com>
---
MAINTAINERS | 1 +
1 file changed, 1 insertion(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index 6171cc7494..2183d24fd4 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3636,6 +3636,7 @@ S: Supported
F: docs/devel/qom.rst
F: include/qom/
F: qapi/qom.json
+F: scripts/coccinelle/qom-parent/
F: scripts/coccinelle/qom-parent-type.cocci
F: scripts/qom-cast-macro-clean-cocci-gen.py
F: qom/
--
2.47.1
^ permalink raw reply related [flat|nested] 156+ messages in thread* Re: [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory
2026-07-11 22:34 [RFC PATCH 000/134] qom: Make composition-tree parenting mandatory Alexander Graf
` (133 preceding siblings ...)
2026-07-11 22:37 ` [RFC PATCH 134/134] MAINTAINERS: Add scripts/coccinelle/qom-parent/ under QOM Alexander Graf
@ 2026-07-12 10:56 ` Bernhard Beschow
134 siblings, 0 replies; 156+ messages in thread
From: Bernhard Beschow @ 2026-07-12 10:56 UTC (permalink / raw)
To: Alexander Graf, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-riscv, qemu-s390x, Song Gao,
Aditya Gupta, Alexey Kardashevskiy, Farhan Ali, Alistair Francis,
Alistair Francis, Antony Pavlov, Markus Armbruster,
Artyom Tarasenko, BALATON Zoltan, Felipe Balbi,
Christian Borntraeger, Brian Cain, Hendrik Brueckner, Chao Liu,
Huacai Chen, Clément Chigot, Cédric Le Goater,
Helge Deller, Dorjoy Chowdhury, Edgar E . Iglesias,
Alexandre Iooss, Eric Farman, Francisco Iglesias, Gaurav Sharma,
Gautam Gala, Harsh Prateek Bora, Hervé Poussineau,
Jan Kiszka, Max Filippov, Joel Stanley, Jared Rossi, Tyrone Ting,
Frederic Konrad, Laurent Vivier, Manos Pitsidianakis, Bibo Mao,
Mark Cave-Ayland, Glenn Miles, Matthew Rosato, Michael Rolnik,
Michael S . Tsirkin, Niek Linnenbank, Nicholas Piggin,
Palmer Dabbelt, Halil Pasic, Paolo Bonzini, Peter Maydell,
Philippe Mathieu-Daudé, Pierrick Bouvier, Richard Henderson,
Sai Pavan Boddu, Samuel Tardieu, Stafford Horne, Sergio Lopez,
Subbaraya Sundeep, Thomas Huth, Ran Wang, Hao Wu,
Daniel P . Berrangé
Am 11. Juli 2026 22:34:53 UTC schrieb Alexander Graf <graf@amazon.com>:
>
>Motivation
>----------
>Markus observed [1] that a device reaching realize without a
>composition-tree parent is a modeling bug, and that the
>/machine/unattached container that catches such devices today is a
>bug attractor rather than a safety net: it hides the fact that nobody
>decided "what is part of what", and it gives the object an unstable,
>implementation-defined QOM path that is useless for qom-get/qom-set and
>for management tools that want to address board-created devices.
>
>This series makes composition-tree parenting mandatory. After it,
>device_set_realized() errors on a device with no parent,
>memory_region_do_init() asserts that a named region has an owner,
>qdev_connect_gpio_out_named() asserts that the pin being wired has a
>parent, and /machine/unattached is deleted. Every board-created object
>has a stable, human-chosen path.
Hi Alex,
Thanks for the cleanup! I hope the series will eventually find its way into the codebase.
>
>[1] https://lore.kernel.org/qemu-devel/87jyr3w9tc.fsf@pond.sub.org/
>
>Approach
>--------
>Rather than add a parallel "parented" API and migrate callers over
>years, each creation helper is converted in a single rename->reintroduce
>pair: a tree-wide Coccinelle rename of foo() to foo_orphan(), followed
>immediately by a patch that reintroduces foo() with a leading
>(Object *parent, const char *id, ...) signature.
Perhaps I'd have appended the two parameters at the end. This way, the most interesting parameters, especially the type, stand out most, helping me mentally "parse" the code more easily. But maybe this is just me, so this comment shall be no blocker.
>The tree builds after
>every patch and never carries two spellings of the same helper.
>
>The bulk of the series then converts *_orphan() call sites to the
>parented form, one hw/ subdirectory per patch. Most of those commits
>carry a per-callsite table in the commit message giving the chosen
>parent expression, the chosen child name, and the one-line reason
>("board init -> machine", "realize of X -> X", ...); the smaller ones
>carry a prose summary of the same. Those tables are the substance the
>RFC is asking maintainers to review: the mechanical part is trivial,
>the modeling decisions are not.
>
>Some hw/arm commit messages carry wide per-callsite tables that exceed
>76 columns; please view with a fixed-width, non-wrapping mail reader.
>
>Once no *_orphan() callers remain the _orphan variants are deleted, the
>enforcement checks are armed, and /machine/unattached is removed.
>
>Series shape
>------------
> 001-009 core API: object_new_child(); rename->reintroduce for
> qdev_new, sysbus_create_*, pci_new*, isa_new*,
> i2c_slave_*, ssi/usb/sd/adb/virtio/hda/aux/spapr-vio,
> cpu_create
> 010-082 hw/*: convert *_orphan() call sites to the parented form,
> one subdirectory per patch, each with a per-callsite
> reasoning table (or prose summary) in the commit message
> 083-088 delete the qdev/sysbus/pci/isa/i2c/ssi/usb/cpu *_orphan()
> creator variants
> 089-107 memory: give the remaining owner==NULL memory regions an
> owner, then assert on owner==NULL for named regions
> 108-116 irq: rename->reintroduce qemu_allocate_irq*() with an
> owner and name; convert callers; delete _orphan variants
> 117-130 parent the remaining non-device singletons and per-device
> helper objects (main-system-bus, accel, reset container,
> per-MR helpers, per-devfn IOMMU objects, board-created
> CPUs, ...)
> 131-132 arm the enforcement checks and delete /machine/unattached
> 133-134 docs/devel/qom.rst: parenting contract; MAINTAINERS
>
>The Coccinelle scripts used for the rename steps are included under
>scripts/coccinelle/qom-parent/ and referenced from the corresponding
>commit messages.
>
>Not converted in this series
>----------------------------
>A handful of long-lived objects are deliberately left path-less for
>now, each for a specific lifecycle reason called out in the relevant
>commit message:
>
> * TYPE_MIGRATION is a TYPE_DEVICE that is never realized, per the
> upstream comment "TODO make this TYPE_OBJECT once QOM provides
> -global for objects". Parenting it under /machine trips the
> qdev_assert_realized_properly() walk. It can move under /machine
> once it becomes a plain TYPE_OBJECT.
> * RamDiscardManager is unref'd from memory_region_finalize() itself,
> so making it a child<> of the MR would use-after-free during MR
> teardown.
> * TPM backends and VFIO IOMMU containers are user-configurable and
> dynamically created; they belong under /objects/<id> or a
> dedicated /machine/vfio container respectively, and are best
> handled in a follow-up on top of this series.
> * QIOChannel* and per-mapping virtio-shmem objects remain path-less
> by design (transient, refcounted, no stable identity).
>
>Verification
>------------
> * The tree builds for 20 softmmu targets after every patch.
> * Every machine type across those targets was smoke-tested with
> "-M <machine> -S"; none abort on the new assertions.
> * "info qom-tree" on q35 and on aarch64 virt shows no
> /machine/unattached node after the final patch.
> * grep -r 'machine_get_container("unattached")' returns no hits.
>
>AI-assistance disclosure (docs/devel/code-provenance.rst)
This series seems to affect migration. For example, it gives the "ocram" memory region in various imx devices a parent which has been identified as migration breaking before [1]. Migration isn't an issue for imx devices, so no objection there.
How shall we deal with machines where we do care about migration compatibility? Or was migration always broken there due to unstable QOM paths, and so far we were just lucky?
Best regards,
Bernhard
[1] https://lore.kernel.org/qemu-devel/CAFEAcA9cfiDB3+=K+MsHptujVhcPexwaf+1y8kHaV692ORAdgQ@mail.gmail.com/
>----------------------------------------------------------
>Every patch in this series was produced with AI assistance and
>reviewed by the human submitter. Each commit carries an
>
> Assisted-by: Kiro
>
>trailer following the format documented in the Linux kernel's
>Documentation/process/coding-assistants.rst. The tree-wide rename
>patches are Coccinelle-equivalent mechanical transforms; the
>per-callsite parent/name choices in the hw/* commits are the
>AI-assisted modeling decisions this RFC is asking maintainers to
>review.
>
>QEMU's current policy in docs/devel/code-provenance.rst is to decline
>AI-generated contributions absent an explicit exception. This RFC is
>therefore posted to open that discussion: I am requesting an exception
>for this series (or, if the community prefers, will reauthor the parts
>the policy requires) and will not post a non-RFC v1 until that is
>resolved on qemu-devel. The Signed-off-by DCO certification is mine
>as the human reviewer taking full responsibility for the contribution.
>
>
>Alexander Graf (134):
> qom: Introduce object_new_child()
> qdev: Rename qdev_new()/qdev_try_new() to *_orphan()
> qdev: Reintroduce qdev_new() with a mandatory QOM parent
> sysbus: Make sysbus_create_simple()/_varargs() take a QOM parent
> pci: Make pci_new*()/pci_create_simple*() take a QOM parent
> isa: Make isa_new()/isa_try_new()/isa_create_simple() take a QOM
> parent
> i2c: Make i2c_slave_new()/i2c_slave_create_simple() take a QOM parent
> ssi, usb: Make bus-layer creators take a QOM parent
> cpu: Make cpu_create() take a QOM parent
> hw/avr: Give onboard devices a QOM parent
> hw/tricore: Give onboard devices a QOM parent
> hw/xtensa: Give onboard devices a QOM parent
> hw/alpha: Give onboard devices a QOM parent
> hw/nitro: Give onboard devices a QOM parent
> hw/vmapple: Give onboard devices a QOM parent
> hw/hppa: Give onboard devices a QOM parent
> hw/microblaze: Give onboard devices a QOM parent
> hw/sh4: Give onboard devices a QOM parent
> hw/s390x: Give onboard devices a QOM parent
> hw/or1k: Give onboard devices a QOM parent
> hw/loongarch: Give onboard devices a QOM parent
> hw/intc: Give onboard devices a QOM parent
> hw/pci-host: Give onboard devices a QOM parent
> hw/core: Give onboard devices a QOM parent
> hw/remote: Give onboard devices a QOM parent
> hw/ufs: Give onboard devices a QOM parent
> hw/nvme: Give onboard devices a QOM parent
> hw/vfio: Give onboard devices a QOM parent
> hw/mem: Give onboard devices a QOM parent
> hw/cxl: Give onboard devices a QOM parent
> hw/hexagon: Give onboard devices a QOM parent
> hw/xen: Give onboard devices a QOM parent
> hw/display: Give onboard devices a QOM parent
> hw/nvram: Give onboard devices a QOM parent
> hw/dma: Give onboard devices a QOM parent
> hw/misc: Give onboard devices a QOM parent
> hw/scsi: Give onboard devices a QOM parent
> hw/net: Give onboard devices a QOM parent
> hw/ide: Give onboard devices a QOM parent
> hw/i3c: Give onboard devices a QOM parent
> hw/pci-bridge: Give onboard devices a QOM parent
> hw/sparc64: Give onboard devices a QOM parent
> hw/sparc: Give onboard devices a QOM parent
> hw/m68k: Give onboard devices a QOM parent
> hw/rtc: Give onboard devices a QOM parent
> hw/i2c: Give onboard devices a QOM parent
> hw/block: Give onboard devices a QOM parent
> hw/char: Give onboard devices a QOM parent
> hw/isa: Give onboard devices a QOM parent
> hw/pci: Give onboard devices a QOM parent
> hw/riscv: Give onboard devices a QOM parent
> hw/mips: Give onboard devices a QOM parent
> hw/i386: Give onboard devices a QOM parent
> hw/ppc: Give onboard devices a QOM parent
> hw/pci, hw/isa: Give VGA and slot-NIC helpers a QOM parent
> hw/arm/virt: Give onboard devices a QOM parent
> hw/arm/sbsa-ref: Give onboard devices a QOM parent
> hw/arm/xilinx-zynq: Give onboard devices a QOM parent
> hw/arm/xlnx-versal, xlnx-zynqmp: Give onboard devices a QOM parent
> hw/arm/realview, integratorcp: Give onboard devices a QOM parent
> hw/arm/npcm: Give onboard devices a QOM parent
> hw/arm/versatile, vexpress: Give onboard devices a QOM parent
> hw/arm/stellaris, musicpal: Give onboard devices a QOM parent
> hw/arm/exynos: Give onboard devices a QOM parent
> hw/arm/allwinner: Give onboard devices a QOM parent
> hw/arm/strongarm: Give onboard devices a QOM parent
> hw/arm/omap: Give onboard devices a QOM parent
> hw/arm/mps2: Give onboard devices a QOM parent
> hw/arm/imx: Give onboard devices a QOM parent
> hw/arm/misc: Give onboard devices a QOM parent
> hw/arm/aspeed: Give onboard devices a QOM parent (part 1)
> hw/arm/aspeed: Give onboard devices a QOM parent (part 2)
> hw/nvram/at24c: Give at24c_eeprom_init() a QOM parent
> hw/i386/pc: Give pcspk a QOM parent
> hw/timer, hw/net: Give i8254 and isa-ne2000 helpers a QOM parent
> hw/misc/unimp: Give create_unimplemented_device() a QOM parent
> hw/usb: Give -usbdevice and auto-hub devices a QOM parent
> hw/audio: Give -audio model= devices a QOM parent
> hw/xen: Give xenstore-driven backend devices a QOM parent
> hw/nitro: Give the vsock bridge a QOM parent
> hw/isa: Give the isabus-bridge a QOM parent
> net, target/mips: Give -nic and CPU-with-clock helpers a QOM parent
> usb, ssi, i2c: Remove *_orphan() creator variants
> isa: Remove *_orphan() creator variants
> pci: Remove *_orphan() creator variants
> cpu: Remove cpu_create_orphan()
> sysbus: Remove *_orphan() creator variants
> qdev: Remove qdev_new_orphan() and qdev_try_new_orphan()
> memory: Accept non-device owners in memory_region_init_ram()
> hw/misc-boards: Give memory regions an explicit owner
> hw/mips: Give memory regions an explicit owner
> hw/riscv: Give memory regions an explicit owner
> hw/i386: Give memory regions an explicit owner
> hw/arm: Give memory regions an explicit owner
> hw/arm/omap1: Give memory regions an explicit owner
> hw/sh4: Give memory regions an explicit owner
> hw/m68k: Give memory regions an explicit owner
> hw/ppc: Give memory regions an explicit owner
> hw/tricore: Give memory regions an explicit owner
> hw/xtensa: Give memory regions an explicit owner
> hw/display: Give memory regions an explicit owner
> hw/arm/omap: Give lcdc and dma memory regions an explicit owner
> hw/char: Give parallel and htif memory regions an explicit owner
> hw/remote: Give memory regions an explicit owner
> system, backends: Give named memory regions an explicit owner
> hw/ide: Let ide_init_ioport() take an explicit owner
> memory: Require an owner for named memory regions
> irq: Rename qemu_allocate_irq*() and friends to *_orphan()
> irq: Reintroduce qemu_allocate_irq*() with a mandatory owner and name
> hw/pci, hw/usb, system: Give allocated IRQs an owner and name
> hw/i386, hw/xen: Give allocated IRQs an owner and name
> hw/arm: Give allocated IRQs an owner and name
> hw/xtensa: Give allocated IRQs an owner and name
> hw: Give allocated IRQs an owner and name
> hw/core: Parent GPIO input IRQs and embedded IRQState via QOM
> irq: Delete the *_orphan() IRQ allocation variants
> sysbus: Parent main-system-bus directly under /machine
> accel: Parent the accelerator singleton under /machine
> hw/core/reset: Give the root reset container and legacy shims a QOM
> path
> system: Parent per-MR helper objects under their owner
> hw/virtio, hw/display: Parent per-device helper objects
> hw/i386/amd_iommu: Parent internally-created AMDVI-PCI under the IOMMU
> hw/s390x, hw/remote: Parent per-devfn IOMMU objects
> hw/pci-host/raven: Parent the OR-IRQ under the host bridge
> hw/arm/mps2: Parent the OR-IRQ gates under the machine
> hw/arm/digic: Parent the DIGIC SoC under the machine
> hw/microblaze: Parent the CPU under the machine
> hw: Pair object_initialize_child() with plain realize()
> hw: Parent board-created CPUs under the machine
> hw/pci-host/versatile: Use object_initialize_child() for pci_dev
> docs, qapi, scripts, iotests: Update /machine/unattached path
> references
> qom: Delete /machine/unattached and error on unparented realize
> docs/devel/qom: Document the composition-tree parenting contract
> MAINTAINERS: Add scripts/coccinelle/qom-parent/ under QOM
>
> MAINTAINERS | 1 +
> accel/accel-system.c | 4 +-
> backends/igvm.c | 6 +-
> bsd-user/main.c | 3 +-
> docs/devel/qom.rst | 96 +++++++
> docs/devel/s390-cpu-topology.rst | 2 +-
> docs/system/cpu-hotplug.rst | 4 +-
> hw/alpha/alpha_sys.h | 3 +-
> hw/alpha/dp264.c | 16 +-
> hw/alpha/typhoon.c | 10 +-
> hw/arm/allwinner-a10.c | 4 +-
> hw/arm/allwinner-h3.c | 34 ++-
> hw/arm/allwinner-r40.c | 4 +-
> hw/arm/armsse.c | 13 +-
> hw/arm/aspeed.c | 39 +--
> hw/arm/aspeed_ast1040_evb.c | 6 +-
> hw/arm/aspeed_ast10x0_evb.c | 12 +-
> hw/arm/aspeed_ast2400_palmetto.c | 8 +-
> hw/arm/aspeed_ast2400_quanta-q71l.c | 18 +-
> hw/arm/aspeed_ast2400_supermicrox11.c | 8 +-
> hw/arm/aspeed_ast2500_evb.c | 7 +-
> hw/arm/aspeed_ast2500_g220a.c | 11 +-
> hw/arm/aspeed_ast2500_romulus.c | 3 +-
> hw/arm/aspeed_ast2500_supermicro-x11spi.c | 8 +-
> hw/arm/aspeed_ast2500_tiogapass.c | 13 +-
> hw/arm/aspeed_ast2500_witherspoon.c | 34 +--
> hw/arm/aspeed_ast2500_yosemitev2.c | 13 +-
> hw/arm/aspeed_ast2600_anacapa.c | 51 ++--
> hw/arm/aspeed_ast2600_bletchley.c | 33 ++-
> hw/arm/aspeed_ast2600_catalina.c | 99 +++----
> hw/arm/aspeed_ast2600_evb.c | 7 +-
> hw/arm/aspeed_ast2600_fby35.c | 20 +-
> hw/arm/aspeed_ast2600_fuji.c | 111 ++++----
> hw/arm/aspeed_ast2600_gb200nvl.c | 24 +-
> hw/arm/aspeed_ast2600_rainier.c | 188 ++++++++------
> hw/arm/aspeed_ast27x0-fc.c | 9 +-
> hw/arm/aspeed_ast27x0_evb.c | 3 +-
> hw/arm/aspeed_soc_common.c | 14 +-
> hw/arm/bananapi_m2u.c | 6 +-
> hw/arm/collie.c | 6 +-
> hw/arm/cubieboard.c | 6 +-
> hw/arm/digic_boards.c | 5 +-
> hw/arm/exynos4210.c | 70 ++---
> hw/arm/exynos4_boards.c | 15 +-
> hw/arm/fsl-imx25.c | 2 +-
> hw/arm/fsl-imx31.c | 2 +-
> hw/arm/fsl-imx6.c | 7 +-
> hw/arm/fsl-imx6ul.c | 37 +--
> hw/arm/fsl-imx7.c | 41 +--
> hw/arm/fsl-imx8mm.c | 2 +-
> hw/arm/fsl-imx8mp.c | 2 +-
> hw/arm/imx25_pdk.c | 6 +-
> hw/arm/imx8mm-evk.c | 6 +-
> hw/arm/imx8mp-evk.c | 6 +-
> hw/arm/integratorcp.c | 56 ++--
> hw/arm/kzm.c | 6 +-
> hw/arm/max78000_soc.c | 107 ++++----
> hw/arm/max78000fthr.c | 5 +-
> hw/arm/mcimx6ul-evk.c | 4 +-
> hw/arm/mcimx7d-sabre.c | 4 +-
> hw/arm/mps2-tz.c | 27 +-
> hw/arm/mps2.c | 91 ++++---
> hw/arm/mps3r.c | 20 +-
> hw/arm/msf2-soc.c | 24 +-
> hw/arm/msf2-som.c | 12 +-
> hw/arm/musca.c | 4 +-
> hw/arm/musicpal.c | 50 ++--
> hw/arm/netduino2.c | 5 +-
> hw/arm/netduinoplus2.c | 5 +-
> hw/arm/npcm7xx.c | 95 +++----
> hw/arm/npcm7xx_boards.c | 117 +++++----
> hw/arm/npcm8xx.c | 147 +++++------
> hw/arm/npcm8xx_boards.c | 19 +-
> hw/arm/nrf51_soc.c | 4 +-
> hw/arm/olimex-stm32-h405.c | 5 +-
> hw/arm/omap1.c | 244 ++++++++++--------
> hw/arm/omap_sx1.c | 20 +-
> hw/arm/orangepi.c | 4 +-
> hw/arm/raspi.c | 4 +-
> hw/arm/realview.c | 113 ++++----
> hw/arm/sabrelite.c | 5 +-
> hw/arm/sbsa-ref.c | 76 +++---
> hw/arm/stellaris.c | 99 ++++---
> hw/arm/stm32f100_soc.c | 62 ++---
> hw/arm/stm32f205_soc.c | 2 +-
> hw/arm/stm32f405_soc.c | 88 +++----
> hw/arm/stm32l4x5_soc.c | 88 +++----
> hw/arm/stm32vldiscovery.c | 5 +-
> hw/arm/strongarm.c | 27 +-
> hw/arm/strongarm.h | 2 +-
> hw/arm/versatilepb.c | 85 +++---
> hw/arm/vexpress.c | 87 ++++---
> hw/arm/virt.c | 97 +++----
> hw/arm/xilinx_zynq.c | 160 ++++++------
> hw/arm/xlnx-versal-virt.c | 5 +-
> hw/arm/xlnx-versal.c | 197 ++++++--------
> hw/arm/xlnx-zcu102.c | 14 +-
> hw/arm/xlnx-zynqmp.c | 8 +-
> hw/audio/intel-hda.c | 4 +-
> hw/audio/model.c | 5 +-
> hw/avr/atmega.c | 24 +-
> hw/block/fdc-sysbus.c | 13 +-
> hw/block/fdc.c | 4 +-
> hw/block/pflash_cfi01.c | 6 +-
> hw/block/pflash_cfi02.c | 6 +-
> hw/block/xen-block.c | 5 +-
> hw/char/diva-gsp.c | 3 +-
> hw/char/exynos4210_uart.c | 6 +-
> hw/char/mcf_uart.c | 11 +-
> hw/char/mchp_pfsoc_mmuart.c | 4 +-
> hw/char/omap_uart.c | 4 +-
> hw/char/parallel-isa.c | 10 +-
> hw/char/parallel.c | 5 +-
> hw/char/pl011.c | 6 +-
> hw/char/riscv_htif.c | 5 +-
> hw/char/serial-isa.c | 11 +-
> hw/char/serial-mm.c | 6 +-
> hw/char/sifive_uart.c | 8 +-
> hw/char/spapr_vty.c | 6 +-
> hw/char/xen_console.c | 7 +-
> hw/core/cpu-common.c | 6 +-
> hw/core/gpio.c | 24 +-
> hw/core/irq.c | 38 +--
> hw/core/null-machine.c | 2 +-
> hw/core/qdev-user.c | 6 +-
> hw/core/qdev.c | 39 ++-
> hw/core/reset.c | 13 +-
> hw/core/sysbus.c | 22 +-
> hw/cxl/cxl-host.c | 9 +-
> hw/display/cg3.c | 2 +-
> hw/display/g364fb.c | 2 +-
> hw/display/macfb.c | 2 +-
> hw/display/omap_lcdc.c | 5 +-
> hw/display/sii9022.c | 2 +-
> hw/display/sm501.c | 6 +-
> hw/display/vhost-user-gpu.c | 12 +-
> hw/display/virtio-gpu-gl.c | 2 +-
> hw/display/vmware_vga.c | 2 +-
> hw/display/xlnx_dp.c | 14 +-
> hw/dma/i8257.c | 10 +-
> hw/dma/omap_dma.c | 9 +-
> hw/dma/rc4030.c | 7 +-
> hw/hexagon/hexagon_dsp.c | 21 +-
> hw/hexagon/virt.c | 29 +--
> hw/hppa/machine.c | 96 ++++---
> hw/i2c/aspeed_i2c.c | 4 +-
> hw/i2c/core.c | 22 +-
> hw/i2c/smbus_eeprom.c | 11 +-
> hw/i386/amd_iommu.c | 3 +-
> hw/i386/isapc.c | 17 +-
> hw/i386/kvm/clock.c | 4 +-
> hw/i386/kvm/clock.h | 2 +-
> hw/i386/kvm/i8259.c | 8 +-
> hw/i386/kvm/xen-stubs.c | 2 +-
> hw/i386/kvm/xen_evtchn.c | 6 +-
> hw/i386/kvm/xen_evtchn.h | 3 +-
> hw/i386/kvm/xen_gnttab.c | 6 +-
> hw/i386/kvm/xen_gnttab.h | 2 +-
> hw/i386/kvm/xen_overlay.c | 6 +-
> hw/i386/kvm/xen_overlay.h | 2 +-
> hw/i386/kvm/xen_primary_console.c | 5 +-
> hw/i386/kvm/xen_primary_console.h | 2 +-
> hw/i386/kvm/xen_xenstore.c | 5 +-
> hw/i386/kvm/xen_xenstore.h | 2 +-
> hw/i386/microvm.c | 34 +--
> hw/i386/nitro_enclave.c | 9 +-
> hw/i386/pc.c | 96 +++----
> hw/i386/pc_piix.c | 28 +-
> hw/i386/pc_q35.c | 42 +--
> hw/i386/pc_sysfw.c | 16 +-
> hw/i386/sgx.c | 5 +-
> hw/i386/x86-common.c | 33 ++-
> hw/i386/x86-cpu.c | 4 +-
> hw/i386/xen/xen-hvm.c | 12 +-
> hw/i386/xen/xen-pvh.c | 5 +-
> hw/i386/xen/xen_pvdevice.c | 2 +-
> hw/i3c/core.c | 19 +-
> hw/ide/ahci.c | 2 +-
> hw/ide/ide-bus.c | 5 +-
> hw/ide/ide-internal.h | 2 +-
> hw/ide/ioport.c | 37 ++-
> hw/ide/isa.c | 9 +-
> hw/ide/pci.c | 2 +-
> hw/ide/piix.c | 2 +-
> hw/intc/apic_common.c | 3 +-
> hw/intc/exynos4210_gic.c | 4 +-
> hw/intc/i8259.c | 6 +-
> hw/intc/i8259_common.c | 7 +-
> hw/intc/riscv_aclint.c | 16 +-
> hw/intc/riscv_aplic.c | 13 +-
> hw/intc/riscv_imsic.c | 7 +-
> hw/intc/s390_flic.c | 12 +-
> hw/intc/sh_intc.c | 21 +-
> hw/intc/sifive_plic.c | 7 +-
> hw/ipack/ipack.c | 11 +-
> hw/ipmi/ipmi_bt.c | 2 +-
> hw/ipmi/ipmi_kcs.c | 2 +-
> hw/isa/i82378.c | 13 +-
> hw/isa/isa-bus.c | 44 ++--
> hw/isa/isa-superio.c | 25 +-
> hw/isa/lpc_ich9.c | 2 +-
> hw/isa/piix.c | 4 +-
> hw/isa/vt82c686.c | 7 +-
> hw/loongarch/virt.c | 56 ++--
> hw/m68k/an5206.c | 13 +-
> hw/m68k/mcf5206.c | 8 +-
> hw/m68k/mcf5208.c | 32 ++-
> hw/m68k/mcf_intc.c | 7 +-
> hw/m68k/next-cube.c | 26 +-
> hw/m68k/q800.c | 28 +-
> hw/m68k/virt.c | 25 +-
> hw/mem/sparse-mem.c | 6 +-
> hw/microblaze/petalogix_ml605_mmu.c | 40 ++-
> hw/microblaze/petalogix_s3adsp1800_mmu.c | 27 +-
> hw/microblaze/xlnx-zynqmp-pmu.c | 4 +-
> hw/mips/boston.c | 32 +--
> hw/mips/cps.c | 5 +-
> hw/mips/fuloong2e.c | 24 +-
> hw/mips/jazz.c | 73 +++---
> hw/mips/loongson3_virt.c | 40 +--
> hw/mips/malta.c | 49 ++--
> hw/mips/mips_int.c | 2 +-
> hw/misc/empty_slot.c | 7 +-
> hw/misc/led.c | 15 +-
> hw/misc/macio/macio.c | 2 +-
> hw/misc/sifive_e_prci.c | 6 +-
> hw/misc/sifive_test.c | 6 +-
> hw/net/can/can_kvaser_pci.c | 2 +-
> hw/net/imx_fec.c | 4 +-
> hw/net/lan9118.c | 10 +-
> hw/net/smc91c111.c | 6 +-
> hw/net/spapr_llan.c | 6 +-
> hw/net/xen_nic.c | 5 +-
> hw/nitro/machine.c | 11 +-
> hw/nitro/nitro-vsock-bus.c | 9 +-
> hw/nubus/nubus-virtio-mmio.c | 2 +-
> hw/nvme/ctrl.c | 2 +-
> hw/nvram/eeprom_at24c.c | 12 +-
> hw/nvram/fw_cfg.c | 16 +-
> hw/or1k/or1k-sim.c | 25 +-
> hw/or1k/virt.c | 43 +--
> hw/pci-bridge/pci_expander_bridge.c | 13 +-
> hw/pci-host/articia.c | 6 +-
> hw/pci-host/astro.c | 8 +-
> hw/pci-host/bonito.c | 28 +-
> hw/pci-host/grackle.c | 2 +-
> hw/pci-host/gt64120.c | 5 +-
> hw/pci-host/i440fx.c | 2 +-
> hw/pci-host/mv64361.c | 4 +-
> hw/pci-host/pnv_phb.c | 5 +-
> hw/pci-host/pnv_phb3.c | 3 +-
> hw/pci-host/pnv_phb3_msi.c | 3 +-
> hw/pci-host/pnv_phb4.c | 3 +-
> hw/pci-host/pnv_phb4_pec.c | 3 +-
> hw/pci-host/ppc4xx_pci.c | 2 +-
> hw/pci-host/ppce500.c | 2 +-
> hw/pci-host/raven.c | 6 +-
> hw/pci-host/sabre.c | 12 +-
> hw/pci-host/sh_pci.c | 3 +-
> hw/pci-host/uninorth.c | 11 +-
> hw/pci-host/versatile.c | 3 +-
> hw/pci/pci.c | 60 +++--
> hw/pci/pcie_sriov.c | 3 +-
> hw/ppc/amigaone.c | 24 +-
> hw/ppc/e500.c | 70 ++---
> hw/ppc/mac_newworld.c | 58 +++--
> hw/ppc/mac_oldworld.c | 32 +--
> hw/ppc/pegasos.c | 22 +-
> hw/ppc/pnv.c | 33 +--
> hw/ppc/pnv_bmc.c | 4 +-
> hw/ppc/pnv_lpc.c | 6 +-
> hw/ppc/pnv_psi.c | 6 +-
> hw/ppc/ppc440.h | 2 +-
> hw/ppc/ppc440_bamboo.c | 17 +-
> hw/ppc/ppc440_uc.c | 10 +-
> hw/ppc/ppc4xx_sdram.c | 34 +--
> hw/ppc/prep.c | 50 ++--
> hw/ppc/sam460ex.c | 72 +++---
> hw/ppc/spapr.c | 37 +--
> hw/ppc/spapr_irq.c | 6 +-
> hw/ppc/spapr_vio.c | 6 +-
> hw/ppc/virtex_ml507.c | 23 +-
> hw/remote/iommu.c | 5 +-
> hw/remote/machine.c | 6 +-
> hw/remote/memory.c | 3 +-
> hw/remote/vfio-user-obj.c | 2 +-
> hw/riscv/aia.c | 12 +-
> hw/riscv/aia.h | 3 +-
> hw/riscv/boston-aia.c | 31 ++-
> hw/riscv/cps.c | 14 +-
> hw/riscv/k230.c | 127 ++++-----
> hw/riscv/microblaze-v-generic.c | 51 ++--
> hw/riscv/microchip_pfsoc.c | 90 +++----
> hw/riscv/opentitan.c | 52 ++--
> hw/riscv/shakti_c.c | 8 +-
> hw/riscv/sifive_e.c | 25 +-
> hw/riscv/sifive_u.c | 39 +--
> hw/riscv/spike.c | 8 +-
> hw/riscv/tt_atlantis.c | 17 +-
> hw/riscv/virt.c | 57 ++--
> hw/riscv/xiangshan_kmh.c | 20 +-
> hw/rtc/ls7a_rtc.c | 2 +-
> hw/rtc/mc146818rtc.c | 6 +-
> hw/rtc/sun4v-rtc.c | 6 +-
> hw/s390x/ap-bridge.c | 6 +-
> hw/s390x/css-bridge.c | 7 +-
> hw/s390x/s390-pci-bus.c | 12 +-
> hw/s390x/s390-virtio-ccw.c | 41 ++-
> hw/scsi/esp-pci.c | 2 +-
> hw/scsi/lasi_ncr710.c | 8 +-
> hw/scsi/lasi_ncr710.h | 4 +-
> hw/scsi/ncr53c710.c | 15 +-
> hw/scsi/ncr53c710.h | 7 +-
> hw/scsi/scsi-bus.c | 5 +-
> hw/scsi/spapr_vscsi.c | 6 +-
> hw/sh4/r2d.c | 38 +--
> hw/sh4/sh7750.c | 35 +--
> hw/sparc/leon3.c | 27 +-
> hw/sparc/sun4m.c | 167 ++++++------
> hw/sparc64/niagara.c | 20 +-
> hw/sparc64/sparc64.c | 3 +-
> hw/sparc64/sun4u.c | 69 ++---
> hw/ssi/ssi.c | 7 +-
> hw/timer/arm_timer.c | 6 +-
> hw/timer/sh_timer.c | 9 +-
> hw/tricore/tc27x_soc.c | 77 +++---
> hw/tricore/tricore_testboard.c | 19 +-
> hw/ufs/lu.c | 5 +-
> hw/usb/bus.c | 15 +-
> hw/usb/dev-serial.c | 3 +-
> hw/usb/vt82c686-uhci-pci.c | 4 +-
> hw/vfio/igd.c | 5 +-
> hw/virtio/virtio-mem.c | 5 +-
> hw/vmapple/vmapple.c | 66 ++---
> hw/xen/xen-bus.c | 5 +-
> hw/xen/xen-legacy-backend.c | 5 +-
> hw/xen/xen-pvh-common.c | 26 +-
> hw/xen/xen_pt_graphics.c | 3 +-
> hw/xtensa/mx_pic.c | 8 +-
> hw/xtensa/pic_cpu.c | 5 +-
> hw/xtensa/sim.c | 15 +-
> hw/xtensa/virt.c | 4 +-
> hw/xtensa/xtensa_memory.c | 5 +-
> hw/xtensa/xtensa_memory.h | 3 +-
> hw/xtensa/xtfpga.c | 51 ++--
> include/hw/arm/aspeed.h | 6 +-
> include/hw/arm/aspeed_soc.h | 3 +-
> include/hw/arm/exynos4210.h | 2 +-
> include/hw/arm/omap.h | 11 +-
> include/hw/block/fdc.h | 5 +-
> include/hw/block/flash.h | 4 +-
> include/hw/char/mchp_pfsoc_mmuart.h | 2 +-
> include/hw/char/parallel.h | 5 +-
> include/hw/char/pl011.h | 2 +-
> include/hw/char/riscv_htif.h | 3 +-
> include/hw/char/serial-isa.h | 2 +-
> include/hw/char/serial-mm.h | 2 +-
> include/hw/char/sifive_uart.h | 4 +-
> include/hw/core/cpu.h | 11 +-
> include/hw/core/irq.h | 27 +-
> include/hw/core/qdev.h | 50 ++--
> include/hw/core/sysbus.h | 29 ++-
> include/hw/i2c/i2c.h | 29 ++-
> include/hw/i2c/smbus_eeprom.h | 5 +-
> include/hw/i386/pc.h | 6 +-
> include/hw/i386/vmport.h | 5 -
> include/hw/i386/x86.h | 7 +-
> include/hw/i3c/i3c.h | 9 +-
> include/hw/ide/isa.h | 3 +-
> include/hw/intc/i8259.h | 4 +-
> include/hw/intc/riscv_aclint.h | 6 +-
> include/hw/intc/riscv_aplic.h | 5 +-
> include/hw/intc/riscv_imsic.h | 3 +-
> include/hw/intc/sifive_plic.h | 3 +-
> include/hw/isa/i8259_internal.h | 3 +-
> include/hw/isa/isa.h | 11 +-
> include/hw/m68k/mcf.h | 7 +-
> include/hw/mem/sparse-mem.h | 2 +-
> include/hw/mips/mips.h | 5 +-
> include/hw/misc/empty_slot.h | 3 +-
> include/hw/misc/sifive_e_prci.h | 2 +-
> include/hw/misc/sifive_test.h | 2 +-
> include/hw/misc/unimp.h | 9 +-
> include/hw/net/lan9118.h | 2 +-
> include/hw/net/ne2000-isa.h | 8 +-
> include/hw/net/smc91c111.h | 2 +-
> include/hw/nitro/nitro-vsock-bus.h | 2 +-
> include/hw/nvram/eeprom_at24c.h | 6 +-
> include/hw/pci/pci.h | 19 +-
> include/hw/ppc/pnv.h | 2 +-
> include/hw/ppc/spapr_vio.h | 8 +-
> include/hw/rtc/mc146818rtc.h | 2 +-
> include/hw/rtc/sun4v-rtc.h | 2 +-
> include/hw/sh4/sh.h | 3 +-
> include/hw/sh4/sh_intc.h | 3 +-
> include/hw/ssi/ssi.h | 3 +-
> include/hw/timer/i8254.h | 13 +-
> include/hw/timer/tmu012.h | 3 +-
> include/hw/usb/usb.h | 13 +-
> include/hw/xen/xen.h | 2 +-
> include/hw/xtensa/mx_pic.h | 4 +-
> include/net/net.h | 5 +-
> include/qom/object.h | 25 ++
> linux-user/main.c | 6 +-
> net/net.c | 10 +-
> qapi/block-core.json | 12 +-
> qapi/block.json | 2 +-
> qapi/machine.json | 12 +-
> qapi/qom.json | 4 +-
> qom/object.c | 13 +
> scripts/arm_processor_error.py | 3 +-
> .../qom-parent/cpu-create-orphan.cocci | 13 +
> .../qom-parent/i2c-slave-new-orphan.cocci | 18 ++
> .../coccinelle/qom-parent/irq-rename.cocci | 14 +
> .../qom-parent/isa-new-orphan.cocci | 23 ++
> .../qom-parent/pci-new-orphan.cocci | 28 ++
> .../qom-parent/qdev-new-orphan.cocci | 18 ++
> .../qom-parent/ssi-usb-orphan.cocci | 18 ++
> .../qom-parent/sysbus-create-orphan.cocci | 18 ++
> scripts/qmp_helper.py | 2 +-
> stubs/xen-hw-stub.c | 2 +-
> system/ioport.c | 12 +-
> system/memory.c | 23 +-
> system/physmem.c | 4 +-
> system/qdev-monitor.c | 2 +-
> system/qtest.c | 2 +-
> system/ram-block-attributes.c | 7 +-
> system/vl.c | 3 +-
> target/mips/cpu.c | 5 +-
> target/mips/cpu.h | 3 +-
> target/xtensa/cpu.c | 11 -
> target/xtensa/cpu.h | 2 -
> tests/qemu-iotests/172.out | 72 +++---
> tests/qemu-iotests/186.out | 10 +-
> tests/qemu-iotests/common.filter | 2 +-
> tests/qtest/fuzz/generic_fuzz.c | 2 +-
> tests/unit/test-qdev-global-props.c | 17 +-
> tests/unit/test-qdev.c | 12 +-
> 438 files changed, 4515 insertions(+), 3784 deletions(-)
> create mode 100644 scripts/coccinelle/qom-parent/cpu-create-orphan.cocci
> create mode 100644 scripts/coccinelle/qom-parent/i2c-slave-new-orphan.cocci
> create mode 100644 scripts/coccinelle/qom-parent/irq-rename.cocci
> create mode 100644 scripts/coccinelle/qom-parent/isa-new-orphan.cocci
> create mode 100644 scripts/coccinelle/qom-parent/pci-new-orphan.cocci
> create mode 100644 scripts/coccinelle/qom-parent/qdev-new-orphan.cocci
> create mode 100644 scripts/coccinelle/qom-parent/ssi-usb-orphan.cocci
> create mode 100644 scripts/coccinelle/qom-parent/sysbus-create-orphan.cocci
>
^ permalink raw reply [flat|nested] 156+ messages in thread