All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] ppc/pnv: generate dtb after machine initialization is complete
@ 2026-03-27 12:41 Shivang Upadhyay
  2026-03-27 12:54 ` Peter Maydell
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Shivang Upadhyay @ 2026-03-27 12:41 UTC (permalink / raw)
  To: qemu-ppc, qemu-devel
  Cc: npiggin, milesg, Shivang Upadhyay, Aditya Gupta,
	Harsh Prateek Bora, BALATON Zoltan, qemu-stable,
	Nathan Chancellor, Peter Maydell

Currently, the machine dtb is generated in pnv_init(), before all devices
are fully initialized. This can result in an incomplete dtb for the system,
as seen in bug [1].

Fix this by deferring dtb generation until machine initialization is complete,
using the machine_init_done_notifier hook.

[1] https://lore.kernel.org/all/20260323231612.GA2637687@ax162/

Cc: Aditya Gupta <adityag@linux.ibm.com>
Cc: Harsh Prateek Bora <harshpb@linux.ibm.com>
Cc: BALATON Zoltan <balaton@eik.bme.hu>
Cc: qemu-stable@nongnu.org
Reported-by: Nathan Chancellor <nathan@kernel.org>
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
Fixes: a16d4c2f162a86d ("ppc/pnv: fix dumpdtb option")
Signed-off-by: Shivang Upadhyay <shivangu@linux.ibm.com>

---
Changes:

v2:
* moved pnv->bmc initialization to pnv_machine_init_done.

v1:
* https://lore.kernel.org/all/20260324135026.247418-1-shivangu@linux.ibm.com/
---
 hw/ppc/pnv.c         | 58 +++++++++++++++++++++++++-------------------
 include/hw/ppc/pnv.h |  2 ++
 2 files changed, 35 insertions(+), 25 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 7e54b6bc60..524563dcfc 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -748,31 +748,10 @@ static void pnv_powerdown_notify(Notifier *n, void *opaque)
 
 static void pnv_reset(MachineState *machine, ResetType type)
 {
-    PnvMachineState *pnv = PNV_MACHINE(machine);
-    IPMIBmc *bmc;
     void *fdt;
 
     qemu_devices_reset(type);
 
-    /*
-     * The machine should provide by default an internal BMC simulator.
-     * If not, try to use the BMC device that was provided on the command
-     * line.
-     */
-    bmc = pnv_bmc_find(&error_fatal);
-    if (!pnv->bmc) {
-        if (!bmc) {
-            if (!qtest_enabled()) {
-                warn_report("machine has no BMC device. Use '-device "
-                            "ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' "
-                            "to define one");
-            }
-        } else {
-            pnv_bmc_set_pnor(bmc, pnv->pnor);
-            pnv->bmc = bmc;
-        }
-    }
-
     fdt = machine->fdt;
     cpu_physical_memory_write(PNV_FDT_ADDR, fdt, fdt_totalsize(fdt));
 }
@@ -984,6 +963,37 @@ static uint64_t pnv_chip_get_ram_size(PnvMachineState *pnv, int chip_id)
     return chip_id == 0 ? 1 * GiB : QEMU_ALIGN_DOWN(ram_per_chip, 1 * MiB);
 }
 
+static void pnv_machine_init_done(Notifier *notifier, void *data)
+{
+    PnvMachineState *pnv = container_of(notifier, PnvMachineState, machine_init_done);
+    MachineState *machine = MACHINE(pnv);
+    IPMIBmc *bmc;
+
+    /*
+     * The machine should provide by default an internal BMC simulator.
+     * If not, try to use the BMC device that was provided on the command
+     * line.
+     */
+    bmc = pnv_bmc_find(&error_fatal);
+    if (!pnv->bmc) {
+        if (!bmc) {
+            if (!qtest_enabled()) {
+                warn_report("machine has no BMC device. Use '-device "
+                            "ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' "
+                            "to define one");
+            }
+        } else {
+            pnv_bmc_set_pnor(bmc, pnv->pnor);
+            pnv->bmc = bmc;
+        }
+    }
+
+    if (!machine->fdt) {
+        machine->fdt = pnv_dt_create(machine);
+        _FDT((fdt_pack(machine->fdt)));
+    }
+}
+
 static void pnv_init(MachineState *machine)
 {
     const char *bios_name = machine->firmware ?: FW_FILE_NAME;
@@ -1244,10 +1254,8 @@ static void pnv_init(MachineState *machine)
         pmc->i2c_init(pnv);
     }
 
-    if (!machine->fdt) {
-        machine->fdt = pnv_dt_create(machine);
-        _FDT((fdt_pack(machine->fdt)));
-    }
+    pnv->machine_init_done.notify = pnv_machine_init_done;
+    qemu_add_machine_init_done_notifier(&pnv->machine_init_done);
 }
 
 /*
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 24f8843a40..90028f974d 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -111,6 +111,8 @@ struct PnvMachineState {
 
     bool         big_core;
     bool         lpar_per_core;
+
+    Notifier     machine_init_done;
 };
 
 PnvChip *pnv_get_chip(PnvMachineState *pnv, uint32_t chip_id);
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] ppc/pnv: generate dtb after machine initialization is complete
  2026-03-27 12:41 [PATCH v2] ppc/pnv: generate dtb after machine initialization is complete Shivang Upadhyay
@ 2026-03-27 12:54 ` Peter Maydell
  2026-03-27 15:33   ` Shivang Upadhyay
  2026-03-27 17:11 ` Nathan Chancellor
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 6+ messages in thread
From: Peter Maydell @ 2026-03-27 12:54 UTC (permalink / raw)
  To: Shivang Upadhyay
  Cc: qemu-ppc, qemu-devel, npiggin, milesg, Aditya Gupta,
	Harsh Prateek Bora, BALATON Zoltan, qemu-stable,
	Nathan Chancellor

On Fri, 27 Mar 2026 at 12:42, Shivang Upadhyay <shivangu@linux.ibm.com> wrote:
>
> Currently, the machine dtb is generated in pnv_init(), before all devices
> are fully initialized. This can result in an incomplete dtb for the system,
> as seen in bug [1].
>
> Fix this by deferring dtb generation until machine initialization is complete,
> using the machine_init_done_notifier hook.
>
> [1] https://lore.kernel.org/all/20260323231612.GA2637687@ax162/
>
> Cc: Aditya Gupta <adityag@linux.ibm.com>
> Cc: Harsh Prateek Bora <harshpb@linux.ibm.com>
> Cc: BALATON Zoltan <balaton@eik.bme.hu>
> Cc: qemu-stable@nongnu.org
> Reported-by: Nathan Chancellor <nathan@kernel.org>
> Suggested-by: Peter Maydell <peter.maydell@linaro.org>
> Fixes: a16d4c2f162a86d ("ppc/pnv: fix dumpdtb option")
> Signed-off-by: Shivang Upadhyay <shivangu@linux.ibm.com>
>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] ppc/pnv: generate dtb after machine initialization is complete
  2026-03-27 12:54 ` Peter Maydell
@ 2026-03-27 15:33   ` Shivang Upadhyay
  0 siblings, 0 replies; 6+ messages in thread
From: Shivang Upadhyay @ 2026-03-27 15:33 UTC (permalink / raw)
  To: Peter Maydell
  Cc: qemu-ppc, qemu-devel, npiggin, milesg, Aditya Gupta,
	Harsh Prateek Bora, BALATON Zoltan, qemu-stable,
	Nathan Chancellor

On Fri, 2026-03-27 at 12:54 +0000, Peter Maydell wrote:
> 
> 
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Thanks Peter.

~Shivang.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] ppc/pnv: generate dtb after machine initialization is complete
  2026-03-27 12:41 [PATCH v2] ppc/pnv: generate dtb after machine initialization is complete Shivang Upadhyay
  2026-03-27 12:54 ` Peter Maydell
@ 2026-03-27 17:11 ` Nathan Chancellor
  2026-03-29  7:09 ` Aditya Gupta
  2026-03-31 13:20 ` Philippe Mathieu-Daudé
  3 siblings, 0 replies; 6+ messages in thread
From: Nathan Chancellor @ 2026-03-27 17:11 UTC (permalink / raw)
  To: Shivang Upadhyay
  Cc: qemu-ppc, qemu-devel, npiggin, milesg, Aditya Gupta,
	Harsh Prateek Bora, BALATON Zoltan, qemu-stable, Peter Maydell

On Fri, Mar 27, 2026 at 06:11:36PM +0530, Shivang Upadhyay wrote:
> Currently, the machine dtb is generated in pnv_init(), before all devices
> are fully initialized. This can result in an incomplete dtb for the system,
> as seen in bug [1].
> 
> Fix this by deferring dtb generation until machine initialization is complete,
> using the machine_init_done_notifier hook.
> 
> [1] https://lore.kernel.org/all/20260323231612.GA2637687@ax162/
> 
> Cc: Aditya Gupta <adityag@linux.ibm.com>
> Cc: Harsh Prateek Bora <harshpb@linux.ibm.com>
> Cc: BALATON Zoltan <balaton@eik.bme.hu>
> Cc: qemu-stable@nongnu.org
> Reported-by: Nathan Chancellor <nathan@kernel.org>
> Suggested-by: Peter Maydell <peter.maydell@linaro.org>
> Fixes: a16d4c2f162a86d ("ppc/pnv: fix dumpdtb option")
> Signed-off-by: Shivang Upadhyay <shivangu@linux.ibm.com>

This still works for me.

Tested-by: Nathan Chancellor <nathan@kernel.org>

> ---
> Changes:
> 
> v2:
> * moved pnv->bmc initialization to pnv_machine_init_done.
> 
> v1:
> * https://lore.kernel.org/all/20260324135026.247418-1-shivangu@linux.ibm.com/
> ---
>  hw/ppc/pnv.c         | 58 +++++++++++++++++++++++++-------------------
>  include/hw/ppc/pnv.h |  2 ++
>  2 files changed, 35 insertions(+), 25 deletions(-)
> 
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index 7e54b6bc60..524563dcfc 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -748,31 +748,10 @@ static void pnv_powerdown_notify(Notifier *n, void *opaque)
>  
>  static void pnv_reset(MachineState *machine, ResetType type)
>  {
> -    PnvMachineState *pnv = PNV_MACHINE(machine);
> -    IPMIBmc *bmc;
>      void *fdt;
>  
>      qemu_devices_reset(type);
>  
> -    /*
> -     * The machine should provide by default an internal BMC simulator.
> -     * If not, try to use the BMC device that was provided on the command
> -     * line.
> -     */
> -    bmc = pnv_bmc_find(&error_fatal);
> -    if (!pnv->bmc) {
> -        if (!bmc) {
> -            if (!qtest_enabled()) {
> -                warn_report("machine has no BMC device. Use '-device "
> -                            "ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' "
> -                            "to define one");
> -            }
> -        } else {
> -            pnv_bmc_set_pnor(bmc, pnv->pnor);
> -            pnv->bmc = bmc;
> -        }
> -    }
> -
>      fdt = machine->fdt;
>      cpu_physical_memory_write(PNV_FDT_ADDR, fdt, fdt_totalsize(fdt));
>  }
> @@ -984,6 +963,37 @@ static uint64_t pnv_chip_get_ram_size(PnvMachineState *pnv, int chip_id)
>      return chip_id == 0 ? 1 * GiB : QEMU_ALIGN_DOWN(ram_per_chip, 1 * MiB);
>  }
>  
> +static void pnv_machine_init_done(Notifier *notifier, void *data)
> +{
> +    PnvMachineState *pnv = container_of(notifier, PnvMachineState, machine_init_done);
> +    MachineState *machine = MACHINE(pnv);
> +    IPMIBmc *bmc;
> +
> +    /*
> +     * The machine should provide by default an internal BMC simulator.
> +     * If not, try to use the BMC device that was provided on the command
> +     * line.
> +     */
> +    bmc = pnv_bmc_find(&error_fatal);
> +    if (!pnv->bmc) {
> +        if (!bmc) {
> +            if (!qtest_enabled()) {
> +                warn_report("machine has no BMC device. Use '-device "
> +                            "ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' "
> +                            "to define one");
> +            }
> +        } else {
> +            pnv_bmc_set_pnor(bmc, pnv->pnor);
> +            pnv->bmc = bmc;
> +        }
> +    }
> +
> +    if (!machine->fdt) {
> +        machine->fdt = pnv_dt_create(machine);
> +        _FDT((fdt_pack(machine->fdt)));
> +    }
> +}
> +
>  static void pnv_init(MachineState *machine)
>  {
>      const char *bios_name = machine->firmware ?: FW_FILE_NAME;
> @@ -1244,10 +1254,8 @@ static void pnv_init(MachineState *machine)
>          pmc->i2c_init(pnv);
>      }
>  
> -    if (!machine->fdt) {
> -        machine->fdt = pnv_dt_create(machine);
> -        _FDT((fdt_pack(machine->fdt)));
> -    }
> +    pnv->machine_init_done.notify = pnv_machine_init_done;
> +    qemu_add_machine_init_done_notifier(&pnv->machine_init_done);
>  }
>  
>  /*
> diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
> index 24f8843a40..90028f974d 100644
> --- a/include/hw/ppc/pnv.h
> +++ b/include/hw/ppc/pnv.h
> @@ -111,6 +111,8 @@ struct PnvMachineState {
>  
>      bool         big_core;
>      bool         lpar_per_core;
> +
> +    Notifier     machine_init_done;
>  };
>  
>  PnvChip *pnv_get_chip(PnvMachineState *pnv, uint32_t chip_id);
> -- 
> 2.53.0
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] ppc/pnv: generate dtb after machine initialization is complete
  2026-03-27 12:41 [PATCH v2] ppc/pnv: generate dtb after machine initialization is complete Shivang Upadhyay
  2026-03-27 12:54 ` Peter Maydell
  2026-03-27 17:11 ` Nathan Chancellor
@ 2026-03-29  7:09 ` Aditya Gupta
  2026-03-31 13:20 ` Philippe Mathieu-Daudé
  3 siblings, 0 replies; 6+ messages in thread
From: Aditya Gupta @ 2026-03-29  7:09 UTC (permalink / raw)
  To: Shivang Upadhyay, qemu-ppc, qemu-devel
  Cc: npiggin, milesg, Harsh Prateek Bora, BALATON Zoltan, qemu-stable,
	Nathan Chancellor, Peter Maydell

On 27/03/26 18:11, Shivang Upadhyay wrote:

> Currently, the machine dtb is generated in pnv_init(), before all devices
> are fully initialized. This can result in an incomplete dtb for the system,
> as seen in bug [1].
>
> Fix this by deferring dtb generation until machine initialization is complete,
> using the machine_init_done_notifier hook.
>
> [1] https://lore.kernel.org/all/20260323231612.GA2637687@ax162/
>
> Cc: Aditya Gupta <adityag@linux.ibm.com>
> Cc: Harsh Prateek Bora <harshpb@linux.ibm.com>
> Cc: BALATON Zoltan <balaton@eik.bme.hu>
> Cc: qemu-stable@nongnu.org
> Reported-by: Nathan Chancellor <nathan@kernel.org>
> Suggested-by: Peter Maydell <peter.maydell@linaro.org>
> Fixes: a16d4c2f162a86d ("ppc/pnv: fix dumpdtb option")
> Signed-off-by: Shivang Upadhyay <shivangu@linux.ibm.com>
>
> ---
> Changes:
>
> v2:
> * moved pnv->bmc initialization to pnv_machine_init_done.
>
> v1:
> * https://lore.kernel.org/all/20260324135026.247418-1-shivangu@linux.ibm.com/
> ---
>   hw/ppc/pnv.c         | 58 +++++++++++++++++++++++++-------------------
>   include/hw/ppc/pnv.h |  2 ++
>   2 files changed, 35 insertions(+), 25 deletions(-)


Reviewed-by: Aditya Gupta <adityag@linux.ibm.com>


Thanks,

- Aditya G



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] ppc/pnv: generate dtb after machine initialization is complete
  2026-03-27 12:41 [PATCH v2] ppc/pnv: generate dtb after machine initialization is complete Shivang Upadhyay
                   ` (2 preceding siblings ...)
  2026-03-29  7:09 ` Aditya Gupta
@ 2026-03-31 13:20 ` Philippe Mathieu-Daudé
  3 siblings, 0 replies; 6+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-03-31 13:20 UTC (permalink / raw)
  To: Shivang Upadhyay, qemu-ppc, qemu-devel
  Cc: npiggin, milesg, Aditya Gupta, Harsh Prateek Bora, BALATON Zoltan,
	qemu-stable, Nathan Chancellor, Peter Maydell

On 27/3/26 13:41, Shivang Upadhyay wrote:
> Currently, the machine dtb is generated in pnv_init(), before all devices
> are fully initialized. This can result in an incomplete dtb for the system,
> as seen in bug [1].
> 
> Fix this by deferring dtb generation until machine initialization is complete,
> using the machine_init_done_notifier hook.
> 
> [1] https://lore.kernel.org/all/20260323231612.GA2637687@ax162/
> 
> Cc: Aditya Gupta <adityag@linux.ibm.com>
> Cc: Harsh Prateek Bora <harshpb@linux.ibm.com>
> Cc: BALATON Zoltan <balaton@eik.bme.hu>
> Cc: qemu-stable@nongnu.org
> Reported-by: Nathan Chancellor <nathan@kernel.org>
> Suggested-by: Peter Maydell <peter.maydell@linaro.org>
> Fixes: a16d4c2f162a86d ("ppc/pnv: fix dumpdtb option")
> Signed-off-by: Shivang Upadhyay <shivangu@linux.ibm.com>
> 
> ---
> Changes:
> 
> v2:
> * moved pnv->bmc initialization to pnv_machine_init_done.
> 
> v1:
> * https://lore.kernel.org/all/20260324135026.247418-1-shivangu@linux.ibm.com/
> ---
>   hw/ppc/pnv.c         | 58 +++++++++++++++++++++++++-------------------
>   include/hw/ppc/pnv.h |  2 ++
>   2 files changed, 35 insertions(+), 25 deletions(-)

Queued via hw-misc tree, thanks.


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-03-31 13:20 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-27 12:41 [PATCH v2] ppc/pnv: generate dtb after machine initialization is complete Shivang Upadhyay
2026-03-27 12:54 ` Peter Maydell
2026-03-27 15:33   ` Shivang Upadhyay
2026-03-27 17:11 ` Nathan Chancellor
2026-03-29  7:09 ` Aditya Gupta
2026-03-31 13:20 ` Philippe Mathieu-Daudé

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.