Message ID | 20200407043606.291546-11-david@gibson.dropbear.id.au (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [PULL,01/10] hw/ppc/e500.c: Handle qemu_find_file() failure | expand |
Hi, On Tue, Apr 7, 2020 at 6:42 AM David Gibson <david@gibson.dropbear.id.au> wrote: > > From: Cédric Le Goater <clg@kaod.org> > > Commit e2392d4395dd ("ppc/pnv: Create BMC devices at machine init") > introduced default BMC devices which can be a problem when the same > devices are defined on the command line with : > > -device ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10 > > QEMU fails with : > > qemu-system-ppc64: error creating device tree: node: FDT_ERR_EXISTS > > Use defaults_enabled() when creating the default BMC devices to let > the user provide its own BMC devices using '-nodefaults'. If no BMC > device are provided, output a warning but let QEMU run as this is a > supported configuration. However, when multiple BMC devices are > defined, stop QEMU with a clear error as the results are unexpected. > > Fixes: e2392d4395dd ("ppc/pnv: Create BMC devices at machine init") > Reported-by: Nathan Chancellor <natechancellor@gmail.com> > Signed-off-by: Cédric Le Goater <clg@kaod.org> > Message-Id: <20200404153655.166834-1-clg@kaod.org> > Tested-by: Nathan Chancellor <natechancellor@gmail.com> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au> > --- Not sure if directly related to this patch, but on gitlab-ci we get: TEST check-qtest-ppc64: tests/qtest/m48t59-test TEST check-qtest-ppc64: tests/qtest/device-plug-test TEST check-qtest-ppc64: tests/qtest/pnv-xscom-test TEST check-qtest-ppc64: tests/qtest/migration-test TEST check-qtest-ppc64: tests/qtest/rtas-test TEST check-qtest-ppc64: tests/qtest/usb-hcd-uhci-test TEST check-qtest-ppc64: tests/qtest/usb-hcd-xhci-test TEST check-qtest-ppc64: tests/qtest/test-filter-mirror TEST check-qtest-ppc64: tests/qtest/test-filter-redirector TEST check-qtest-ppc64: tests/qtest/display-vga-test TEST check-qtest-ppc64: tests/qtest/numa-test TEST check-qtest-ppc64: tests/qtest/ivshmem-test TEST check-qtest-ppc64: tests/qtest/cpu-plug-test TEST check-qtest-ppc64: tests/qtest/cdrom-test TEST check-qtest-ppc64: tests/qtest/device-introspect-test qemu-system-ppc64: warning: machine has no BMC device. Use '-device ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' to define one qemu-system-ppc64: warning: machine has no BMC device. Use '-device ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' to define one qemu-system-ppc64: warning: machine has no BMC device. Use '-device ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' to define one Since this is very confusing, can you adapt the test? Thanks, Phil.
On 6/19/20 8:02 PM, Philippe Mathieu-Daudé wrote: > Hi, > > On Tue, Apr 7, 2020 at 6:42 AM David Gibson <david@gibson.dropbear.id.au> wrote: >> >> From: Cédric Le Goater <clg@kaod.org> >> >> Commit e2392d4395dd ("ppc/pnv: Create BMC devices at machine init") >> introduced default BMC devices which can be a problem when the same >> devices are defined on the command line with : >> >> -device ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10 >> >> QEMU fails with : >> >> qemu-system-ppc64: error creating device tree: node: FDT_ERR_EXISTS >> >> Use defaults_enabled() when creating the default BMC devices to let >> the user provide its own BMC devices using '-nodefaults'. If no BMC >> device are provided, output a warning but let QEMU run as this is a >> supported configuration. However, when multiple BMC devices are >> defined, stop QEMU with a clear error as the results are unexpected. >> >> Fixes: e2392d4395dd ("ppc/pnv: Create BMC devices at machine init") >> Reported-by: Nathan Chancellor <natechancellor@gmail.com> >> Signed-off-by: Cédric Le Goater <clg@kaod.org> >> Message-Id: <20200404153655.166834-1-clg@kaod.org> >> Tested-by: Nathan Chancellor <natechancellor@gmail.com> >> Signed-off-by: David Gibson <david@gibson.dropbear.id.au> >> --- > > Not sure if directly related to this patch, but on gitlab-ci we get: > > TEST check-qtest-ppc64: tests/qtest/m48t59-test > TEST check-qtest-ppc64: tests/qtest/device-plug-test > TEST check-qtest-ppc64: tests/qtest/pnv-xscom-test > TEST check-qtest-ppc64: tests/qtest/migration-test > TEST check-qtest-ppc64: tests/qtest/rtas-test > TEST check-qtest-ppc64: tests/qtest/usb-hcd-uhci-test > TEST check-qtest-ppc64: tests/qtest/usb-hcd-xhci-test > TEST check-qtest-ppc64: tests/qtest/test-filter-mirror > TEST check-qtest-ppc64: tests/qtest/test-filter-redirector > TEST check-qtest-ppc64: tests/qtest/display-vga-test > TEST check-qtest-ppc64: tests/qtest/numa-test > TEST check-qtest-ppc64: tests/qtest/ivshmem-test > TEST check-qtest-ppc64: tests/qtest/cpu-plug-test > TEST check-qtest-ppc64: tests/qtest/cdrom-test > TEST check-qtest-ppc64: tests/qtest/device-introspect-test > qemu-system-ppc64: warning: machine has no BMC device. Use '-device > ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' to define > one > qemu-system-ppc64: warning: machine has no BMC device. Use '-device > ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' to define > one > qemu-system-ppc64: warning: machine has no BMC device. Use '-device > ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' to define > one I can not reproduce. Is gitlab-ci doing something special ? C.
On 6/22/20 9:09 AM, Cédric Le Goater wrote: > On 6/19/20 8:02 PM, Philippe Mathieu-Daudé wrote: >> Hi, >> >> On Tue, Apr 7, 2020 at 6:42 AM David Gibson <david@gibson.dropbear.id.au> wrote: >>> >>> From: Cédric Le Goater <clg@kaod.org> >>> >>> Commit e2392d4395dd ("ppc/pnv: Create BMC devices at machine init") >>> introduced default BMC devices which can be a problem when the same >>> devices are defined on the command line with : >>> >>> -device ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10 >>> >>> QEMU fails with : >>> >>> qemu-system-ppc64: error creating device tree: node: FDT_ERR_EXISTS >>> >>> Use defaults_enabled() when creating the default BMC devices to let >>> the user provide its own BMC devices using '-nodefaults'. If no BMC >>> device are provided, output a warning but let QEMU run as this is a >>> supported configuration. However, when multiple BMC devices are >>> defined, stop QEMU with a clear error as the results are unexpected. >>> >>> Fixes: e2392d4395dd ("ppc/pnv: Create BMC devices at machine init") >>> Reported-by: Nathan Chancellor <natechancellor@gmail.com> >>> Signed-off-by: Cédric Le Goater <clg@kaod.org> >>> Message-Id: <20200404153655.166834-1-clg@kaod.org> >>> Tested-by: Nathan Chancellor <natechancellor@gmail.com> >>> Signed-off-by: David Gibson <david@gibson.dropbear.id.au> >>> --- >> >> Not sure if directly related to this patch, but on gitlab-ci we get: >> >> TEST check-qtest-ppc64: tests/qtest/m48t59-test >> TEST check-qtest-ppc64: tests/qtest/device-plug-test >> TEST check-qtest-ppc64: tests/qtest/pnv-xscom-test >> TEST check-qtest-ppc64: tests/qtest/migration-test >> TEST check-qtest-ppc64: tests/qtest/rtas-test >> TEST check-qtest-ppc64: tests/qtest/usb-hcd-uhci-test >> TEST check-qtest-ppc64: tests/qtest/usb-hcd-xhci-test >> TEST check-qtest-ppc64: tests/qtest/test-filter-mirror >> TEST check-qtest-ppc64: tests/qtest/test-filter-redirector >> TEST check-qtest-ppc64: tests/qtest/display-vga-test >> TEST check-qtest-ppc64: tests/qtest/numa-test >> TEST check-qtest-ppc64: tests/qtest/ivshmem-test >> TEST check-qtest-ppc64: tests/qtest/cpu-plug-test >> TEST check-qtest-ppc64: tests/qtest/cdrom-test >> TEST check-qtest-ppc64: tests/qtest/device-introspect-test >> qemu-system-ppc64: warning: machine has no BMC device. Use '-device >> ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' to define >> one >> qemu-system-ppc64: warning: machine has no BMC device. Use '-device >> ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' to define >> one >> qemu-system-ppc64: warning: machine has no BMC device. Use '-device >> ipmi-bmc-sim,id=bmc0 -device isa-ipmi-bt,bmc=bmc0,irq=10' to define >> one > > I can not reproduce. Is gitlab-ci doing something special ? (Greg already answered elsewhere, for for other readers): The test is ran when using: $ make check-qtest SPEED=slow
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index b75ad06390..c9cb6fa357 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -571,10 +571,29 @@ static void pnv_powerdown_notify(Notifier *n, void *opaque) static void pnv_reset(MachineState *machine) { + PnvMachineState *pnv = PNV_MACHINE(machine); + IPMIBmc *bmc; void *fdt; qemu_devices_reset(); + /* + * 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) { + 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 = pnv_dt_create(machine); /* Pack resulting tree */ @@ -833,9 +852,6 @@ static void pnv_init(MachineState *machine) } g_free(chip_typename); - /* Create the machine BMC simulator */ - pnv->bmc = pnv_bmc_create(pnv->pnor); - /* Instantiate ISA bus on chip 0 */ pnv->isa_bus = pnv_isa_create(pnv->chips[0], &error_fatal); @@ -845,8 +861,14 @@ static void pnv_init(MachineState *machine) /* Create an RTC ISA device too */ mc146818_rtc_init(pnv->isa_bus, 2000, NULL); - /* Create the IPMI BT device for communication with the BMC */ - pnv_ipmi_bt_init(pnv->isa_bus, pnv->bmc, 10); + /* + * Create the machine BMC simulator and the IPMI BT device for + * communication with the BMC + */ + if (defaults_enabled()) { + pnv->bmc = pnv_bmc_create(pnv->pnor); + pnv_ipmi_bt_init(pnv->isa_bus, pnv->bmc, 10); + } /* * OpenPOWER systems use a IPMI SEL Event message to notify the diff --git a/hw/ppc/pnv_bmc.c b/hw/ppc/pnv_bmc.c index 8863354c1c..4e018b8b70 100644 --- a/hw/ppc/pnv_bmc.c +++ b/hw/ppc/pnv_bmc.c @@ -213,6 +213,18 @@ static const IPMINetfn hiomap_netfn = { .cmd_handlers = hiomap_cmds }; + +void pnv_bmc_set_pnor(IPMIBmc *bmc, PnvPnor *pnor) +{ + object_ref(OBJECT(pnor)); + object_property_add_const_link(OBJECT(bmc), "pnor", OBJECT(pnor), + &error_abort); + + /* Install the HIOMAP protocol handlers to access the PNOR */ + ipmi_sim_register_netfn(IPMI_BMC_SIMULATOR(bmc), IPMI_NETFN_OEM, + &hiomap_netfn); +} + /* * Instantiate the machine BMC. PowerNV uses the QEMU internal * simulator but it could also be external. @@ -232,3 +244,36 @@ IPMIBmc *pnv_bmc_create(PnvPnor *pnor) return IPMI_BMC(obj); } + +typedef struct ForeachArgs { + const char *name; + Object *obj; +} ForeachArgs; + +static int bmc_find(Object *child, void *opaque) +{ + ForeachArgs *args = opaque; + + if (object_dynamic_cast(child, args->name)) { + if (args->obj) { + return 1; + } + args->obj = child; + } + return 0; +} + +IPMIBmc *pnv_bmc_find(Error **errp) +{ + ForeachArgs args = { TYPE_IPMI_BMC_SIMULATOR, NULL }; + int ret; + + ret = object_child_foreach_recursive(object_get_root(), bmc_find, &args); + if (ret) { + error_setg(errp, "machine should have only one BMC device. " + "Use '-nodefaults'"); + return NULL; + } + + return args.obj ? IPMI_BMC(args.obj) : NULL; +} diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index fb4d0c0234..d4b0b0e2ff 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -241,6 +241,8 @@ struct PnvMachineState { void pnv_dt_bmc_sensors(IPMIBmc *bmc, void *fdt); void pnv_bmc_powerdown(IPMIBmc *bmc); IPMIBmc *pnv_bmc_create(PnvPnor *pnor); +IPMIBmc *pnv_bmc_find(Error **errp); +void pnv_bmc_set_pnor(IPMIBmc *bmc, PnvPnor *pnor); /* * POWER8 MMIO base addresses