diff mbox series

[05/14] ppc/pnv: Reparent user created PHB3 devices to the PnvChip

Message ID 20211202144235.1276352-6-clg@kaod.org (mailing list archive)
State New, archived
Headers show
Series ppc/pnv: Add support for user created PHB3/PHB4 devices | expand

Commit Message

Cédric Le Goater Dec. 2, 2021, 2:42 p.m. UTC
The powernv machine uses the object hierarchy to populate the device
tree and each device should be parented to the chip it belongs to.
This is not the case for user created devices which are parented to
the container "/unattached".

Make sure a PHB3 device is parented to its chip by reparenting the
object if necessary.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 include/hw/ppc/pnv.h   |  1 +
 hw/pci-host/pnv_phb3.c |  6 ++++++
 hw/ppc/pnv.c           | 17 +++++++++++++++++
 3 files changed, 24 insertions(+)

Comments

Daniel Henrique Barboza Dec. 2, 2021, 5:32 p.m. UTC | #1
On 12/2/21 11:42, Cédric Le Goater wrote:
> The powernv machine uses the object hierarchy to populate the device
> tree and each device should be parented to the chip it belongs to.
> This is not the case for user created devices which are parented to
> the container "/unattached".
> 
> Make sure a PHB3 device is parented to its chip by reparenting the
> object if necessary.
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> ---

Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>

>   include/hw/ppc/pnv.h   |  1 +
>   hw/pci-host/pnv_phb3.c |  6 ++++++
>   hw/ppc/pnv.c           | 17 +++++++++++++++++
>   3 files changed, 24 insertions(+)
> 
> diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
> index 0710673a7fd8..247379ef1f88 100644
> --- a/include/hw/ppc/pnv.h
> +++ b/include/hw/ppc/pnv.h
> @@ -175,6 +175,7 @@ DECLARE_INSTANCE_CHECKER(PnvChip, PNV_CHIP_POWER10,
>                            TYPE_PNV_CHIP_POWER10)
>   
>   PowerPCCPU *pnv_chip_find_cpu(PnvChip *chip, uint32_t pir);
> +void pnv_chip_parent_fixup(PnvChip *chip, Object *obj, int index);
>   
>   #define TYPE_PNV_MACHINE       MACHINE_TYPE_NAME("powernv")
>   typedef struct PnvMachineClass PnvMachineClass;
> diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
> index dd1cf37288a0..e91f658b0060 100644
> --- a/hw/pci-host/pnv_phb3.c
> +++ b/hw/pci-host/pnv_phb3.c
> @@ -1005,6 +1005,12 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
>               error_setg(errp, "invalid chip id: %d", phb->chip_id);
>               return;
>           }
> +
> +        /*
> +         * Reparent user created devices to the chip to build
> +         * correctly the device tree.
> +         */
> +        pnv_chip_parent_fixup(phb->chip, OBJECT(phb), phb->phb_id);
>       }
>   
>       /* LSI sources */
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index d7fe92cb082d..9a458655efd9 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -1784,6 +1784,23 @@ PowerPCCPU *pnv_chip_find_cpu(PnvChip *chip, uint32_t pir)
>       return NULL;
>   }
>   
> +void pnv_chip_parent_fixup(PnvChip *chip, Object *obj, int index)
> +{
> +    Object *parent = OBJECT(chip);
> +    g_autofree char *default_id =
> +        g_strdup_printf("%s[%d]", object_get_typename(obj), index);
> +
> +    if (obj->parent == parent) {
> +        return;
> +    }
> +
> +    object_ref(obj);
> +    object_unparent(obj);
> +    object_property_add_child(
> +        parent, DEVICE(obj)->id ? DEVICE(obj)->id : default_id, obj);
> +    object_unref(obj);
> +}
> +
>   PnvChip *pnv_get_chip(PnvMachineState *pnv, uint32_t chip_id)
>   {
>       int i;
>
Frederic Barrat Dec. 7, 2021, 9:51 a.m. UTC | #2
On 02/12/2021 15:42, Cédric Le Goater wrote:
> The powernv machine uses the object hierarchy to populate the device
> tree and each device should be parented to the chip it belongs to.
> This is not the case for user created devices which are parented to
> the container "/unattached".
> 
> Make sure a PHB3 device is parented to its chip by reparenting the
> object if necessary.
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> ---


It will also be used later for P9, which explains why it's done that 
way, I think. Looks ok to me.

Reviewed-by: Frederic Barrat <fbarrat@linux.ibm.com>


>   include/hw/ppc/pnv.h   |  1 +
>   hw/pci-host/pnv_phb3.c |  6 ++++++
>   hw/ppc/pnv.c           | 17 +++++++++++++++++
>   3 files changed, 24 insertions(+)
> 
> diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
> index 0710673a7fd8..247379ef1f88 100644
> --- a/include/hw/ppc/pnv.h
> +++ b/include/hw/ppc/pnv.h
> @@ -175,6 +175,7 @@ DECLARE_INSTANCE_CHECKER(PnvChip, PNV_CHIP_POWER10,
>                            TYPE_PNV_CHIP_POWER10)
>   
>   PowerPCCPU *pnv_chip_find_cpu(PnvChip *chip, uint32_t pir);
> +void pnv_chip_parent_fixup(PnvChip *chip, Object *obj, int index);
>   
>   #define TYPE_PNV_MACHINE       MACHINE_TYPE_NAME("powernv")
>   typedef struct PnvMachineClass PnvMachineClass;
> diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
> index dd1cf37288a0..e91f658b0060 100644
> --- a/hw/pci-host/pnv_phb3.c
> +++ b/hw/pci-host/pnv_phb3.c
> @@ -1005,6 +1005,12 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
>               error_setg(errp, "invalid chip id: %d", phb->chip_id);
>               return;
>           }
> +
> +        /*
> +         * Reparent user created devices to the chip to build
> +         * correctly the device tree.
> +         */
> +        pnv_chip_parent_fixup(phb->chip, OBJECT(phb), phb->phb_id);
>       }
>   
>       /* LSI sources */
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index d7fe92cb082d..9a458655efd9 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -1784,6 +1784,23 @@ PowerPCCPU *pnv_chip_find_cpu(PnvChip *chip, uint32_t pir)
>       return NULL;
>   }
>   
> +void pnv_chip_parent_fixup(PnvChip *chip, Object *obj, int index)
> +{
> +    Object *parent = OBJECT(chip);
> +    g_autofree char *default_id =
> +        g_strdup_printf("%s[%d]", object_get_typename(obj), index);
> +
> +    if (obj->parent == parent) {
> +        return;
> +    }
> +
> +    object_ref(obj);
> +    object_unparent(obj);
> +    object_property_add_child(
> +        parent, DEVICE(obj)->id ? DEVICE(obj)->id : default_id, obj);
> +    object_unref(obj);
> +}
> +
>   PnvChip *pnv_get_chip(PnvMachineState *pnv, uint32_t chip_id)
>   {
>       int i;
>
diff mbox series

Patch

diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 0710673a7fd8..247379ef1f88 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -175,6 +175,7 @@  DECLARE_INSTANCE_CHECKER(PnvChip, PNV_CHIP_POWER10,
                          TYPE_PNV_CHIP_POWER10)
 
 PowerPCCPU *pnv_chip_find_cpu(PnvChip *chip, uint32_t pir);
+void pnv_chip_parent_fixup(PnvChip *chip, Object *obj, int index);
 
 #define TYPE_PNV_MACHINE       MACHINE_TYPE_NAME("powernv")
 typedef struct PnvMachineClass PnvMachineClass;
diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
index dd1cf37288a0..e91f658b0060 100644
--- a/hw/pci-host/pnv_phb3.c
+++ b/hw/pci-host/pnv_phb3.c
@@ -1005,6 +1005,12 @@  static void pnv_phb3_realize(DeviceState *dev, Error **errp)
             error_setg(errp, "invalid chip id: %d", phb->chip_id);
             return;
         }
+
+        /*
+         * Reparent user created devices to the chip to build
+         * correctly the device tree.
+         */
+        pnv_chip_parent_fixup(phb->chip, OBJECT(phb), phb->phb_id);
     }
 
     /* LSI sources */
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index d7fe92cb082d..9a458655efd9 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1784,6 +1784,23 @@  PowerPCCPU *pnv_chip_find_cpu(PnvChip *chip, uint32_t pir)
     return NULL;
 }
 
+void pnv_chip_parent_fixup(PnvChip *chip, Object *obj, int index)
+{
+    Object *parent = OBJECT(chip);
+    g_autofree char *default_id =
+        g_strdup_printf("%s[%d]", object_get_typename(obj), index);
+
+    if (obj->parent == parent) {
+        return;
+    }
+
+    object_ref(obj);
+    object_unparent(obj);
+    object_property_add_child(
+        parent, DEVICE(obj)->id ? DEVICE(obj)->id : default_id, obj);
+    object_unref(obj);
+}
+
 PnvChip *pnv_get_chip(PnvMachineState *pnv, uint32_t chip_id)
 {
     int i;