diff mbox

[v4,02/26] ppc/xics: fix ICP and ICS reset

Message ID 1488205773-30436-3-git-send-email-clg@kaod.org
State New
Headers show

Commit Message

Cédric Le Goater Feb. 27, 2017, 2:29 p.m. UTC
commit 5b17c7207938 ("xics: XICS should not be a SysBusDevice")
changed the nature of the XICS object to be a descendent of
TYPE_DEVICE. By doing so, the object is not on a bus and its reset
handler is not called anymore. The direct consequence is that the ICP
and ICS objects are not correctly initialized and so the IRQ subsystem
is broken in the guest.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 hw/ppc/spapr.c        | 1 +
 include/hw/ppc/xics.h | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

Comments

David Gibson Feb. 28, 2017, 2 a.m. UTC | #1
On Mon, Feb 27, 2017 at 03:29:09PM +0100, Cédric Le Goater wrote:
> commit 5b17c7207938 ("xics: XICS should not be a SysBusDevice")
> changed the nature of the XICS object to be a descendent of
> TYPE_DEVICE. By doing so, the object is not on a bus and its reset
> handler is not called anymore. The direct consequence is that the ICP
> and ICS objects are not correctly initialized and so the IRQ subsystem
> is broken in the guest.
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>

I've merged 1&2 into my tree, but folded together.  First, I don't
want to break bisects, second you reference an explicit commit above,
which would have been made incorrect by rebases of the first patch.

> ---
>  hw/ppc/spapr.c        | 1 +
>  include/hw/ppc/xics.h | 2 +-
>  2 files changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index ceefbb57d0ac..3c79068075e4 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -104,6 +104,7 @@ static XICSState *try_create_xics(const char *type, int nr_servers,
>      dev = DEVICE(object_new(type));
>      qdev_prop_set_uint32(dev, "nr_servers", nr_servers);
>      qdev_prop_set_uint32(dev, "nr_irqs", nr_irqs);
> +    qdev_set_parent_bus(dev, sysbus_get_default());
>      object_property_set_bool(OBJECT(dev), true, "realized", &err);
>      if (err) {
>          error_propagate(errp, err);
> diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
> index 3f0c31610aa4..1aefd3d52257 100644
> --- a/include/hw/ppc/xics.h
> +++ b/include/hw/ppc/xics.h
> @@ -80,7 +80,7 @@ struct XICSStateClass {
>  
>  struct XICSState {
>      /*< private >*/
> -    SysBusDevice parent_obj;
> +    DeviceState parent_obj;
>      /*< public >*/
>      uint32_t nr_servers;
>      uint32_t nr_irqs;
Cédric Le Goater Feb. 28, 2017, 6:54 a.m. UTC | #2
On 02/28/2017 03:00 AM, David Gibson wrote:
> On Mon, Feb 27, 2017 at 03:29:09PM +0100, Cédric Le Goater wrote:
>> commit 5b17c7207938 ("xics: XICS should not be a SysBusDevice")
>> changed the nature of the XICS object to be a descendent of
>> TYPE_DEVICE. By doing so, the object is not on a bus and its reset
>> handler is not called anymore. The direct consequence is that the ICP
>> and ICS objects are not correctly initialized and so the IRQ subsystem
>> is broken in the guest.
>>
>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> 
> I've merged 1&2 into my tree, but folded together.  First, I don't
> want to break bisects, second you reference an explicit commit above,
> which would have been made incorrect by rebases of the first patch.

Perfect. That was the thing to do. 

Thanks,

C.
diff mbox

Patch

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index ceefbb57d0ac..3c79068075e4 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -104,6 +104,7 @@  static XICSState *try_create_xics(const char *type, int nr_servers,
     dev = DEVICE(object_new(type));
     qdev_prop_set_uint32(dev, "nr_servers", nr_servers);
     qdev_prop_set_uint32(dev, "nr_irqs", nr_irqs);
+    qdev_set_parent_bus(dev, sysbus_get_default());
     object_property_set_bool(OBJECT(dev), true, "realized", &err);
     if (err) {
         error_propagate(errp, err);
diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
index 3f0c31610aa4..1aefd3d52257 100644
--- a/include/hw/ppc/xics.h
+++ b/include/hw/ppc/xics.h
@@ -80,7 +80,7 @@  struct XICSStateClass {
 
 struct XICSState {
     /*< private >*/
-    SysBusDevice parent_obj;
+    DeviceState parent_obj;
     /*< public >*/
     uint32_t nr_servers;
     uint32_t nr_irqs;