diff mbox series

[PULL,10/10] ppc/pnv: Create BMC devices only when defaults are enabled

Message ID 20200407043606.291546-11-david@gibson.dropbear.id.au
State New
Headers show
Series [PULL,01/10] hw/ppc/e500.c: Handle qemu_find_file() failure | expand

Commit Message

David Gibson April 7, 2020, 4:36 a.m. UTC
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>
---
 hw/ppc/pnv.c         | 32 ++++++++++++++++++++++++++-----
 hw/ppc/pnv_bmc.c     | 45 ++++++++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h |  2 ++
 3 files changed, 74 insertions(+), 5 deletions(-)

Comments

Philippe Mathieu-Daudé June 19, 2020, 6:02 p.m. UTC | #1
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.
Cédric Le Goater June 22, 2020, 7:09 a.m. UTC | #2
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.
Philippe Mathieu-Daudé June 22, 2020, 8:27 a.m. UTC | #3
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 mbox series

Patch

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