From: Aditya Gupta Date: Fri, 24 Apr 2026 08:38:35 +0000 (+0530) Subject: pnv/mpipl: Enable MPIPL support X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=327e82dbd3fc4e45642a055f65cf0a6553b20cf4;p=thirdparty%2Fqemu.git pnv/mpipl: Enable MPIPL support With all MPIPL support in place, export a "dump" node in device tree, signifying that PowerNV QEMU platform supports MPIPL Also, export fw-load-area dt node, which has details about where the kernel & initrd were loaded, so that kernel can verify whether the kernel/initrd images were loaded within the boot memory region. QEMU just exports these details in fw-load-area, the check for boot memory region is done in kernel. Since now device tree can change at pnv_reset, hence regenerate device tree during pnv_reset Reviewed-by: Hari Bathini Reviewed-by: Sourabh Jain Signed-off-by: Aditya Gupta Tested-by: Shivang Upadhyay Link: https://lore.kernel.org/qemu-devel/20260424083837.214947-9-adityag@linux.ibm.com Signed-off-by: Harsh Prateek Bora --- diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 48f49bef825..89096f9a843 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -54,6 +54,7 @@ #include "hw/ppc/pnv_chip.h" #include "hw/ppc/pnv_xscom.h" #include "hw/ppc/pnv_pnor.h" +#include "hw/ppc/pnv_mpipl.h" #include "hw/isa/isa.h" #include "hw/char/serial-isa.h" @@ -672,6 +673,39 @@ static void pnv_dt_power_mgt(PnvMachineState *pnv, void *fdt) _FDT(fdt_setprop_cell(fdt, off, "ibm,enabled-stop-levels", 0xc0000000)); } +static void pnv_dt_mpipl_dump(PnvMachineState *pnv, void *fdt) +{ + int off; + + /* + * Add "dump" node so kernel knows MPIPL (aka fadump) is supported + * + * Note: This is only needed to be done since we are passing device tree to + * opal + * + * In case HDAT is supported in future, then opal can add these nodes by + * itself based on system attribute having MPIPL_SUPPORTED bit set + */ + off = fdt_add_subnode(fdt, 0, "ibm,opal"); + if (off == -FDT_ERR_EXISTS) { + off = fdt_path_offset(fdt, "/ibm,opal"); + } + + _FDT(off); + off = fdt_add_subnode(fdt, off, "dump"); + _FDT(off); + _FDT((fdt_setprop_string(fdt, off, "compatible", "ibm,opal-dump"))); + + /* Add kernel and initrd as fw-load-area */ + uint64_t fw_load_area[4] = { + cpu_to_be64(KERNEL_LOAD_ADDR), cpu_to_be64(KERNEL_MAX_SIZE), + cpu_to_be64(INITRD_LOAD_ADDR), cpu_to_be64(INITRD_MAX_SIZE) + }; + + _FDT((fdt_setprop(fdt, off, "fw-load-area", + fw_load_area, sizeof(fw_load_area)))); +} + static void *pnv_dt_create(MachineState *machine) { PnvMachineClass *pmc = PNV_MACHINE_GET_CLASS(machine); @@ -734,6 +768,9 @@ static void *pnv_dt_create(MachineState *machine) pmc->dt_power_mgt(pnv, fdt); } + /* Advertise support for MPIPL */ + pnv_dt_mpipl_dump(pnv, fdt); + return fdt; } @@ -765,6 +802,10 @@ static void pnv_reset(MachineState *machine, ResetType type) mpipl_write_succeeded = do_mpipl_write(pnv); } + /* Regenerate device tree */ + fdt = pnv_dt_create(machine); + _FDT((fdt_pack(fdt))); + /* * If it's a MPIPL boot, add the "mpipl-boot" property, and reset the * boolean for MPIPL boot for next boot @@ -814,8 +855,11 @@ static void pnv_reset(MachineState *machine, ResetType type) sizeof(proc_area)); } - fdt = machine->fdt; cpu_physical_memory_write(PNV_FDT_ADDR, fdt, fdt_totalsize(fdt)); + + /* Free previous device tree set by pnv_init/reset/machine_init_done */ + g_free(machine->fdt); + machine->fdt = fdt; } static ISABus *pnv_chip_power8_isa_create(PnvChip *chip, Error **errp)