qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3] Add support for pvpanic pci device
@ 2021-01-15 18:34 Mihai Carabas
  2021-01-15 18:34 ` [PATCH 1/4] hw/misc/pvpanic: split-out generic and bus dependent code Mihai Carabas
                   ` (4 more replies)
  0 siblings, 5 replies; 19+ messages in thread
From: Mihai Carabas @ 2021-01-15 18:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: Mihai Carabas, peter.maydell, kraxel

This patchset adds support for pvpanic pci device.

v3 applied feedback:

- patch 1: made pvpanic isa device available only for PC, compile pvpanic-test
  only when isa device is present

- patch 2: fixed device id to 0x0011, used OBJECT_DECLARE_TYPE,
  PVPANIC_PCI_DEVICE, added VMSTATE_PCI_DEVICE, removed INTERFACE_PCIE_DEVICE

- patch 3: fixed documentation

- patch 4: add a qtest for pvpanic-pci

Mihai Carabas (4):
  hw/misc/pvpanic: split-out generic and bus dependent code
  hw/misc/pvpanic: add PCI interface support
  pvpanic : update pvpanic spec document
  tests/qtest: add a test case for pvpanic-pci

 docs/specs/pci-ids.txt         |  1 +
 docs/specs/pvpanic.txt         | 13 +++++-
 hw/i386/Kconfig                |  2 +-
 hw/misc/Kconfig                | 12 +++++-
 hw/misc/meson.build            |  4 +-
 hw/misc/pvpanic-isa.c          | 94 ++++++++++++++++++++++++++++++++++++++++++
 hw/misc/pvpanic-pci.c          | 94 ++++++++++++++++++++++++++++++++++++++++++
 hw/misc/pvpanic.c              | 85 +++-----------------------------------
 include/hw/misc/pvpanic.h      | 24 ++++++++++-
 include/hw/pci/pci.h           |  1 +
 tests/qtest/meson.build        |  3 +-
 tests/qtest/pvpanic-pci-test.c | 62 ++++++++++++++++++++++++++++
 12 files changed, 309 insertions(+), 86 deletions(-)
 create mode 100644 hw/misc/pvpanic-isa.c
 create mode 100644 hw/misc/pvpanic-pci.c
 create mode 100644 tests/qtest/pvpanic-pci-test.c

-- 
1.8.3.1



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

* [PATCH 1/4] hw/misc/pvpanic: split-out generic and bus dependent code
  2021-01-15 18:34 [PATCH v3] Add support for pvpanic pci device Mihai Carabas
@ 2021-01-15 18:34 ` Mihai Carabas
  2021-01-19 13:12   ` Peter Maydell
  2021-01-15 18:34 ` [PATCH 2/4] hw/misc/pvpanic: add PCI interface support Mihai Carabas
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 19+ messages in thread
From: Mihai Carabas @ 2021-01-15 18:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: Mihai Carabas, peter.maydell, kraxel

To ease the PCI device addition in next patches, split the code as follows:
- generic code (read/write/setup) is being kept in pvpanic.c
- ISA dependent code moved to pvpanic-isa.c

Also, rename:
- ISA_PVPANIC_DEVICE -> PVPANIC_ISA_DEVICE.
- TYPE_PVPANIC -> TYPE_PVPANIC_ISA.
- MemoryRegion io -> mr.
- pvpanic_ioport_* in pvpanic_*.

Update the build system with the new files and config structure.

Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
---
 hw/i386/Kconfig           |  2 +-
 hw/misc/Kconfig           |  6 ++-
 hw/misc/meson.build       |  3 +-
 hw/misc/pvpanic-isa.c     | 94 +++++++++++++++++++++++++++++++++++++++++++++++
 hw/misc/pvpanic.c         | 85 +++---------------------------------------
 include/hw/misc/pvpanic.h | 23 +++++++++++-
 tests/qtest/meson.build   |  2 +-
 7 files changed, 130 insertions(+), 85 deletions(-)
 create mode 100644 hw/misc/pvpanic-isa.c

diff --git a/hw/i386/Kconfig b/hw/i386/Kconfig
index eea059f..7f91f30 100644
--- a/hw/i386/Kconfig
+++ b/hw/i386/Kconfig
@@ -14,7 +14,7 @@ config PC
     imply ISA_DEBUG
     imply PARALLEL
     imply PCI_DEVICES
-    imply PVPANIC
+    imply PVPANIC_ISA
     imply QXL
     imply SEV
     imply SGA
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
index cf18ac0..23bc978 100644
--- a/hw/misc/Kconfig
+++ b/hw/misc/Kconfig
@@ -121,9 +121,13 @@ config IOTKIT_SYSCTL
 config IOTKIT_SYSINFO
     bool
 
-config PVPANIC
+config PVPANIC_COMMON
+    bool
+
+config PVPANIC_ISA
     bool
     depends on ISA_BUS
+    select PVPANIC_COMMON
 
 config AUX
     bool
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
index ce15ffc..8c828ad 100644
--- a/hw/misc/meson.build
+++ b/hw/misc/meson.build
@@ -13,6 +13,7 @@ softmmu_ss.add(when: 'CONFIG_EMC141X', if_true: files('emc141x.c'))
 softmmu_ss.add(when: 'CONFIG_UNIMP', if_true: files('unimp.c'))
 softmmu_ss.add(when: 'CONFIG_EMPTY_SLOT', if_true: files('empty_slot.c'))
 softmmu_ss.add(when: 'CONFIG_LED', if_true: files('led.c'))
+softmmu_ss.add(when: 'CONFIG_PVPANIC_COMMON', if_true: files('pvpanic.c'))
 
 # ARM devices
 softmmu_ss.add(when: 'CONFIG_PL310', if_true: files('arm_l2x0.c'))
@@ -97,7 +98,7 @@ softmmu_ss.add(when: 'CONFIG_IOTKIT_SYSINFO', if_true: files('iotkit-sysinfo.c')
 softmmu_ss.add(when: 'CONFIG_ARMSSE_CPUID', if_true: files('armsse-cpuid.c'))
 softmmu_ss.add(when: 'CONFIG_ARMSSE_MHU', if_true: files('armsse-mhu.c'))
 
-softmmu_ss.add(when: 'CONFIG_PVPANIC', if_true: files('pvpanic.c'))
+softmmu_ss.add(when: 'CONFIG_PVPANIC_ISA', if_true: files('pvpanic-isa.c'))
 softmmu_ss.add(when: 'CONFIG_AUX', if_true: files('auxbus.c'))
 softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_scu.c', 'aspeed_sdmc.c', 'aspeed_xdma.c'))
 softmmu_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-sysreg.c'))
diff --git a/hw/misc/pvpanic-isa.c b/hw/misc/pvpanic-isa.c
new file mode 100644
index 0000000..27113ab
--- /dev/null
+++ b/hw/misc/pvpanic-isa.c
@@ -0,0 +1,94 @@
+/*
+ * QEMU simulated pvpanic device.
+ *
+ * Copyright Fujitsu, Corp. 2013
+ *
+ * Authors:
+ *     Wen Congyang <wency@cn.fujitsu.com>
+ *     Hu Tao <hutao@cn.fujitsu.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/log.h"
+#include "qemu/module.h"
+#include "sysemu/runstate.h"
+
+#include "hw/nvram/fw_cfg.h"
+#include "hw/qdev-properties.h"
+#include "hw/misc/pvpanic.h"
+#include "qom/object.h"
+#include "hw/isa/isa.h"
+
+OBJECT_DECLARE_SIMPLE_TYPE(PVPanicISAState, PVPANIC_ISA_DEVICE)
+
+/*
+ * PVPanicISAState for ISA device and
+ * use ioport.
+ */
+struct PVPanicISAState {
+    ISADevice parent_obj;
+
+    uint16_t ioport;
+    PVPanicState pvpanic;
+};
+
+static void pvpanic_isa_initfn(Object *obj)
+{
+    PVPanicISAState *s = PVPANIC_ISA_DEVICE(obj);
+
+    pvpanic_setup_io(&s->pvpanic, DEVICE(s), 1);
+}
+
+static void pvpanic_isa_realizefn(DeviceState *dev, Error **errp)
+{
+    ISADevice *d = ISA_DEVICE(dev);
+    PVPanicISAState *s = PVPANIC_ISA_DEVICE(dev);
+    PVPanicState *ps = &s->pvpanic;
+    FWCfgState *fw_cfg = fw_cfg_find();
+    uint16_t *pvpanic_port;
+
+    if (!fw_cfg) {
+        return;
+    }
+
+    pvpanic_port = g_malloc(sizeof(*pvpanic_port));
+    *pvpanic_port = cpu_to_le16(s->ioport);
+    fw_cfg_add_file(fw_cfg, "etc/pvpanic-port", pvpanic_port,
+                    sizeof(*pvpanic_port));
+
+    isa_register_ioport(d, &ps->mr, s->ioport);
+}
+
+static Property pvpanic_isa_properties[] = {
+    DEFINE_PROP_UINT16(PVPANIC_IOPORT_PROP, PVPanicISAState, ioport, 0x505),
+    DEFINE_PROP_UINT8("events", PVPanicISAState, pvpanic.events, PVPANIC_PANICKED | PVPANIC_CRASHLOADED),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
+static void pvpanic_isa_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->realize = pvpanic_isa_realizefn;
+    device_class_set_props(dc, pvpanic_isa_properties);
+    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
+}
+
+static TypeInfo pvpanic_isa_info = {
+    .name          = TYPE_PVPANIC_ISA_DEVICE,
+    .parent        = TYPE_ISA_DEVICE,
+    .instance_size = sizeof(PVPanicISAState),
+    .instance_init = pvpanic_isa_initfn,
+    .class_init    = pvpanic_isa_class_init,
+};
+
+static void pvpanic_register_types(void)
+{
+    type_register_static(&pvpanic_isa_info);
+}
+
+type_init(pvpanic_register_types)
diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
index 35d6797..e2cb4a5 100644
--- a/hw/misc/pvpanic.c
+++ b/hw/misc/pvpanic.c
@@ -22,18 +22,6 @@
 #include "hw/misc/pvpanic.h"
 #include "qom/object.h"
 
-/* The bit of supported pv event, TODO: include uapi header and remove this */
-#define PVPANIC_F_PANICKED      0
-#define PVPANIC_F_CRASHLOADED   1
-
-/* The pv event value */
-#define PVPANIC_PANICKED        (1 << PVPANIC_F_PANICKED)
-#define PVPANIC_CRASHLOADED     (1 << PVPANIC_F_CRASHLOADED)
-
-typedef struct PVPanicState PVPanicState;
-DECLARE_INSTANCE_CHECKER(PVPanicState, ISA_PVPANIC_DEVICE,
-                         TYPE_PVPANIC)
-
 static void handle_event(int event)
 {
     static bool logged;
@@ -54,90 +42,29 @@ static void handle_event(int event)
     }
 }
 
-#include "hw/isa/isa.h"
-
-struct PVPanicState {
-    ISADevice parent_obj;
-
-    MemoryRegion io;
-    uint16_t ioport;
-    uint8_t events;
-};
-
 /* return supported events on read */
-static uint64_t pvpanic_ioport_read(void *opaque, hwaddr addr, unsigned size)
+static uint64_t pvpanic_read(void *opaque, hwaddr addr, unsigned size)
 {
     PVPanicState *pvp = opaque;
     return pvp->events;
 }
 
-static void pvpanic_ioport_write(void *opaque, hwaddr addr, uint64_t val,
+static void pvpanic_write(void *opaque, hwaddr addr, uint64_t val,
                                  unsigned size)
 {
     handle_event(val);
 }
 
 static const MemoryRegionOps pvpanic_ops = {
-    .read = pvpanic_ioport_read,
-    .write = pvpanic_ioport_write,
+    .read = pvpanic_read,
+    .write = pvpanic_write,
     .impl = {
         .min_access_size = 1,
         .max_access_size = 1,
     },
 };
 
-static void pvpanic_isa_initfn(Object *obj)
-{
-    PVPanicState *s = ISA_PVPANIC_DEVICE(obj);
-
-    memory_region_init_io(&s->io, OBJECT(s), &pvpanic_ops, s, "pvpanic", 1);
-}
-
-static void pvpanic_isa_realizefn(DeviceState *dev, Error **errp)
-{
-    ISADevice *d = ISA_DEVICE(dev);
-    PVPanicState *s = ISA_PVPANIC_DEVICE(dev);
-    FWCfgState *fw_cfg = fw_cfg_find();
-    uint16_t *pvpanic_port;
-
-    if (!fw_cfg) {
-        return;
-    }
-
-    pvpanic_port = g_malloc(sizeof(*pvpanic_port));
-    *pvpanic_port = cpu_to_le16(s->ioport);
-    fw_cfg_add_file(fw_cfg, "etc/pvpanic-port", pvpanic_port,
-                    sizeof(*pvpanic_port));
-
-    isa_register_ioport(d, &s->io, s->ioport);
-}
-
-static Property pvpanic_isa_properties[] = {
-    DEFINE_PROP_UINT16(PVPANIC_IOPORT_PROP, PVPanicState, ioport, 0x505),
-    DEFINE_PROP_UINT8("events", PVPanicState, events, PVPANIC_PANICKED | PVPANIC_CRASHLOADED),
-    DEFINE_PROP_END_OF_LIST(),
-};
-
-static void pvpanic_isa_class_init(ObjectClass *klass, void *data)
+void pvpanic_setup_io(PVPanicState *s, DeviceState *dev, unsigned size)
 {
-    DeviceClass *dc = DEVICE_CLASS(klass);
-
-    dc->realize = pvpanic_isa_realizefn;
-    device_class_set_props(dc, pvpanic_isa_properties);
-    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
+    memory_region_init_io(&s->mr, OBJECT(dev), &pvpanic_ops, s, "pvpanic", size);
 }
-
-static TypeInfo pvpanic_isa_info = {
-    .name          = TYPE_PVPANIC,
-    .parent        = TYPE_ISA_DEVICE,
-    .instance_size = sizeof(PVPanicState),
-    .instance_init = pvpanic_isa_initfn,
-    .class_init    = pvpanic_isa_class_init,
-};
-
-static void pvpanic_register_types(void)
-{
-    type_register_static(&pvpanic_isa_info);
-}
-
-type_init(pvpanic_register_types)
diff --git a/include/hw/misc/pvpanic.h b/include/hw/misc/pvpanic.h
index ae0c818..abc9dde 100644
--- a/include/hw/misc/pvpanic.h
+++ b/include/hw/misc/pvpanic.h
@@ -17,13 +17,32 @@
 
 #include "qom/object.h"
 
-#define TYPE_PVPANIC "pvpanic"
+#define TYPE_PVPANIC_ISA_DEVICE "pvpanic"
 
 #define PVPANIC_IOPORT_PROP "ioport"
 
+/* The bit of supported pv event, TODO: include uapi header and remove this */
+#define PVPANIC_F_PANICKED      0
+#define PVPANIC_F_CRASHLOADED   1
+
+/* The pv event value */
+#define PVPANIC_PANICKED        (1 << PVPANIC_F_PANICKED)
+#define PVPANIC_CRASHLOADED     (1 << PVPANIC_F_CRASHLOADED)
+
+/*
+ * PVPanicState for any device type
+ */
+typedef struct PVPanicState PVPanicState;
+struct PVPanicState {
+    MemoryRegion mr;
+    uint8_t events;
+};
+
+void pvpanic_setup_io(PVPanicState *s, DeviceState *dev, unsigned size);
+
 static inline uint16_t pvpanic_port(void)
 {
-    Object *o = object_resolve_path_type("", TYPE_PVPANIC, NULL);
+    Object *o = object_resolve_path_type("", TYPE_PVPANIC_ISA_DEVICE, NULL);
     if (!o) {
         return 0;
     }
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 6a67c53..b050289 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -33,7 +33,7 @@ qtests_i386 = \
   (config_host.has_key('CONFIG_LINUX') and                                                  \
    config_all_devices.has_key('CONFIG_ISA_IPMI_BT') ? ['ipmi-bt-test'] : []) +              \
   (config_all_devices.has_key('CONFIG_WDT_IB700') ? ['wdt_ib700-test'] : []) +              \
-  (config_all_devices.has_key('CONFIG_PVPANIC') ? ['pvpanic-test'] : []) +                  \
+  (config_all_devices.has_key('CONFIG_PVPANIC_ISA') ? ['pvpanic-test'] : []) +              \
   (config_all_devices.has_key('CONFIG_HDA') ? ['intel-hda-test'] : []) +                    \
   (config_all_devices.has_key('CONFIG_I82801B11') ? ['i82801b11-test'] : []) +             \
   (config_all_devices.has_key('CONFIG_IOH3420') ? ['ioh3420-test'] : []) +                  \
-- 
1.8.3.1



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

* [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
  2021-01-15 18:34 [PATCH v3] Add support for pvpanic pci device Mihai Carabas
  2021-01-15 18:34 ` [PATCH 1/4] hw/misc/pvpanic: split-out generic and bus dependent code Mihai Carabas
@ 2021-01-15 18:34 ` Mihai Carabas
  2021-01-18 10:00   ` Gerd Hoffmann
                     ` (2 more replies)
  2021-01-15 18:34 ` [PATCH 3/4] pvpanic : update pvpanic spec document Mihai Carabas
                   ` (2 subsequent siblings)
  4 siblings, 3 replies; 19+ messages in thread
From: Mihai Carabas @ 2021-01-15 18:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: Mihai Carabas, peter.maydell, kraxel

Add PCI interface support for PVPANIC device. Create a new file pvpanic-pci.c
where the PCI specific routines reside and update the build system with the new
files and config structure.

Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
---
 docs/specs/pci-ids.txt    |  1 +
 hw/misc/Kconfig           |  6 +++
 hw/misc/meson.build       |  1 +
 hw/misc/pvpanic-pci.c     | 94 +++++++++++++++++++++++++++++++++++++++++++++++
 include/hw/misc/pvpanic.h |  1 +
 include/hw/pci/pci.h      |  1 +
 6 files changed, 104 insertions(+)
 create mode 100644 hw/misc/pvpanic-pci.c

diff --git a/docs/specs/pci-ids.txt b/docs/specs/pci-ids.txt
index abbdbca..5e407a6 100644
--- a/docs/specs/pci-ids.txt
+++ b/docs/specs/pci-ids.txt
@@ -64,6 +64,7 @@ PCI devices (other than virtio):
 1b36:000d  PCI xhci usb host adapter
 1b36:000f  mdpy (mdev sample device), linux/samples/vfio-mdev/mdpy.c
 1b36:0010  PCIe NVMe device (-device nvme)
+1b36:0011  PCI PVPanic device (-device pvpanic-pci)
 
 All these devices are documented in docs/specs.
 
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
index 23bc978..19c216f 100644
--- a/hw/misc/Kconfig
+++ b/hw/misc/Kconfig
@@ -124,6 +124,12 @@ config IOTKIT_SYSINFO
 config PVPANIC_COMMON
     bool
 
+config PVPANIC_PCI
+    bool
+    default y if PCI_DEVICES
+    depends on PCI
+    select PVPANIC_COMMON
+
 config PVPANIC_ISA
     bool
     depends on ISA_BUS
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
index 8c828ad..f686019 100644
--- a/hw/misc/meson.build
+++ b/hw/misc/meson.build
@@ -99,6 +99,7 @@ softmmu_ss.add(when: 'CONFIG_ARMSSE_CPUID', if_true: files('armsse-cpuid.c'))
 softmmu_ss.add(when: 'CONFIG_ARMSSE_MHU', if_true: files('armsse-mhu.c'))
 
 softmmu_ss.add(when: 'CONFIG_PVPANIC_ISA', if_true: files('pvpanic-isa.c'))
+softmmu_ss.add(when: 'CONFIG_PVPANIC_PCI', if_true: files('pvpanic-pci.c'))
 softmmu_ss.add(when: 'CONFIG_AUX', if_true: files('auxbus.c'))
 softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_scu.c', 'aspeed_sdmc.c', 'aspeed_xdma.c'))
 softmmu_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-sysreg.c'))
diff --git a/hw/misc/pvpanic-pci.c b/hw/misc/pvpanic-pci.c
new file mode 100644
index 0000000..d629639
--- /dev/null
+++ b/hw/misc/pvpanic-pci.c
@@ -0,0 +1,94 @@
+/*
+ * QEMU simulated PCI pvpanic device.
+ *
+ * Copyright (C) 2020 Oracle
+ *
+ * Authors:
+ *     Mihai Carabas <mihai.carabas@oracle.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/log.h"
+#include "qemu/module.h"
+#include "sysemu/runstate.h"
+
+#include "hw/nvram/fw_cfg.h"
+#include "hw/qdev-properties.h"
+#include "migration/vmstate.h"
+#include "hw/misc/pvpanic.h"
+#include "qom/object.h"
+#include "hw/pci/pci.h"
+
+OBJECT_DECLARE_SIMPLE_TYPE(PVPanicPCIState, PVPANIC_PCI_DEVICE)
+
+/*
+ * PVPanicPCIState for PCI device
+ */
+typedef struct PVPanicPCIState {
+    PCIDevice dev;
+    PVPanicState pvpanic;
+} PVPanicPCIState;
+
+static const VMStateDescription vmstate_pvpanic_pci = {
+    .name = "pvpanic-pci",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_PCI_DEVICE(dev, PVPanicPCIState),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static void pvpanic_pci_realizefn(PCIDevice *dev, Error **errp)
+{
+    PVPanicPCIState *s = PVPANIC_PCI_DEVICE(dev);
+    PVPanicState *ps = &s->pvpanic;
+
+    pvpanic_setup_io(&s->pvpanic, DEVICE(s), 2);
+
+    pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &ps->mr);
+}
+
+static Property pvpanic_pci_properties[] = {
+    DEFINE_PROP_UINT8("events", PVPanicPCIState, pvpanic.events, PVPANIC_PANICKED | PVPANIC_CRASHLOADED),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
+static void pvpanic_pci_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    PCIDeviceClass *pc = PCI_DEVICE_CLASS(klass);
+
+    device_class_set_props(dc, pvpanic_pci_properties);
+
+    pc->realize = pvpanic_pci_realizefn;
+    pc->vendor_id = PCI_VENDOR_ID_REDHAT;
+    pc->device_id = PCI_DEVICE_ID_REDHAT_PVPANIC;
+    pc->revision = 1;
+    pc->class_id = PCI_CLASS_SYSTEM_OTHER;
+    dc->vmsd = &vmstate_pvpanic_pci;
+
+    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
+}
+
+static TypeInfo pvpanic_pci_info = {
+    .name          = TYPE_PVPANIC_PCI_DEVICE,
+    .parent        = TYPE_PCI_DEVICE,
+    .instance_size = sizeof(PVPanicPCIState),
+    .class_init    = pvpanic_pci_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { INTERFACE_CONVENTIONAL_PCI_DEVICE },
+        { }
+    }
+};
+
+static void pvpanic_register_types(void)
+{
+    type_register_static(&pvpanic_pci_info);
+}
+
+type_init(pvpanic_register_types);
diff --git a/include/hw/misc/pvpanic.h b/include/hw/misc/pvpanic.h
index abc9dde..ca3c5bb 100644
--- a/include/hw/misc/pvpanic.h
+++ b/include/hw/misc/pvpanic.h
@@ -18,6 +18,7 @@
 #include "qom/object.h"
 
 #define TYPE_PVPANIC_ISA_DEVICE "pvpanic"
+#define TYPE_PVPANIC_PCI_DEVICE "pvpanic-pci"
 
 #define PVPANIC_IOPORT_PROP "ioport"
 
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index 259f9c9..66db084 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -107,6 +107,7 @@ extern bool pci_available;
 #define PCI_DEVICE_ID_REDHAT_PCIE_BRIDGE 0x000e
 #define PCI_DEVICE_ID_REDHAT_MDPY        0x000f
 #define PCI_DEVICE_ID_REDHAT_NVME        0x0010
+#define PCI_DEVICE_ID_REDHAT_PVPANIC     0x0011
 #define PCI_DEVICE_ID_REDHAT_QXL         0x0100
 
 #define FMT_PCIBUS                      PRIx64
-- 
1.8.3.1



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

* [PATCH 3/4] pvpanic : update pvpanic spec document
  2021-01-15 18:34 [PATCH v3] Add support for pvpanic pci device Mihai Carabas
  2021-01-15 18:34 ` [PATCH 1/4] hw/misc/pvpanic: split-out generic and bus dependent code Mihai Carabas
  2021-01-15 18:34 ` [PATCH 2/4] hw/misc/pvpanic: add PCI interface support Mihai Carabas
@ 2021-01-15 18:34 ` Mihai Carabas
  2021-01-18 10:32   ` Philippe Mathieu-Daudé
  2021-01-19 13:17   ` Peter Maydell
  2021-01-15 18:34 ` [PATCH 4/4] tests/qtest: add a test case for pvpanic-pci Mihai Carabas
  2021-01-19 13:29 ` [PATCH v3] Add support for pvpanic pci device Peter Maydell
  4 siblings, 2 replies; 19+ messages in thread
From: Mihai Carabas @ 2021-01-15 18:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: Mihai Carabas, peter.maydell, kraxel

Add pvpanic PCI device support details in docs/specs/pvpanic.txt.

Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
---
 docs/specs/pvpanic.txt | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/docs/specs/pvpanic.txt b/docs/specs/pvpanic.txt
index a90fbca..974aafd 100644
--- a/docs/specs/pvpanic.txt
+++ b/docs/specs/pvpanic.txt
@@ -1,7 +1,7 @@
 PVPANIC DEVICE
 ==============
 
-pvpanic device is a simulated ISA device, through which a guest panic
+pvpanic device is a simulated device, through which a guest panic
 event is sent to qemu, and a QMP event is generated. This allows
 management apps (e.g. libvirt) to be notified and respond to the event.
 
@@ -9,6 +9,9 @@ The management app has the option of waiting for GUEST_PANICKED events,
 and/or polling for guest-panicked RunState, to learn when the pvpanic
 device has fired a panic event.
 
+The pvpanic device can be implemented as an ISA device (using IOPORT) or as a
+PCI device.
+
 ISA Interface
 -------------
 
@@ -24,6 +27,14 @@ bit 1: a guest panic has happened and will be handled by the guest;
        the host should record it or report it, but should not affect
        the execution of the guest.
 
+PCI Interface
+-------------
+
+The PCI interface is similar to the ISA interface except that it uses an MMIO
+address space provided by its BAR0, 1 byte long. Any machine with a PCI device
+can enable a pvpanic device by adding '-device pvpanic-pci' to the command
+line.
+
 ACPI Interface
 --------------
 
-- 
1.8.3.1



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

* [PATCH 4/4] tests/qtest: add a test case for pvpanic-pci
  2021-01-15 18:34 [PATCH v3] Add support for pvpanic pci device Mihai Carabas
                   ` (2 preceding siblings ...)
  2021-01-15 18:34 ` [PATCH 3/4] pvpanic : update pvpanic spec document Mihai Carabas
@ 2021-01-15 18:34 ` Mihai Carabas
  2021-01-18  7:42   ` Thomas Huth
  2021-01-19 13:16   ` Peter Maydell
  2021-01-19 13:29 ` [PATCH v3] Add support for pvpanic pci device Peter Maydell
  4 siblings, 2 replies; 19+ messages in thread
From: Mihai Carabas @ 2021-01-15 18:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: Mihai Carabas, peter.maydell, kraxel

Add a test case for pvpanic-pci device. The scenario is the same as pvpapnic
ISA device, but is using the PCI bus.

Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
---
 tests/qtest/meson.build        |  1 +
 tests/qtest/pvpanic-pci-test.c | 62 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+)
 create mode 100644 tests/qtest/pvpanic-pci-test.c

diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index b050289..f689cad 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -20,6 +20,7 @@ endif
 
 qtests_pci = \
   (config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : []) +                  \
+  (config_all_devices.has_key('CONFIG_PVPANIC_PCI') ? ['pvpanic-pci-test'] : []) +          \
   (config_all_devices.has_key('CONFIG_IVSHMEM_DEVICE') ? ['ivshmem-test'] : [])
 
 qtests_i386 = \
diff --git a/tests/qtest/pvpanic-pci-test.c b/tests/qtest/pvpanic-pci-test.c
new file mode 100644
index 0000000..79b8065
--- /dev/null
+++ b/tests/qtest/pvpanic-pci-test.c
@@ -0,0 +1,62 @@
+/*
+ * QTest testcase for PV Panic PCI device
+ *
+ * Copyright (C) 2020 Oracle
+ *
+ * Authors:
+ *     Mihai Carabas <mihai.carabas@oracle.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu/osdep.h"
+#include "libqos/libqtest.h"
+#include "qapi/qmp/qdict.h"
+#include "libqos/pci.h"
+#include "libqos/pci-pc.h"
+#include "hw/pci/pci_regs.h"
+
+static void test_panic(void)
+{
+    uint8_t val;
+    QDict *response, *data;
+    QTestState *qts;
+    QPCIBus *pcibus;
+    QPCIDevice *dev;
+    QPCIBar bar;
+
+    qts = qtest_init("-device pvpanic-pci");
+    pcibus = qpci_new_pc(qts, NULL);
+    dev = qpci_device_find(pcibus, QPCI_DEVFN(0x4, 0x0));
+    qpci_device_enable(dev);
+    bar = qpci_iomap(dev, 0, NULL);
+
+    qpci_memread(dev, bar, 0, &val, sizeof(val));
+    g_assert_cmpuint(val, ==, 3);
+
+    val = 1;
+    qpci_memwrite(dev, bar, 0, &val, sizeof(val));
+
+    response = qtest_qmp_eventwait_ref(qts, "GUEST_PANICKED");
+    g_assert(qdict_haskey(response, "data"));
+    data = qdict_get_qdict(response, "data");
+    g_assert(qdict_haskey(data, "action"));
+    g_assert_cmpstr(qdict_get_str(data, "action"), ==, "pause");
+    qobject_unref(response);
+
+    qtest_quit(qts);
+}
+
+int main(int argc, char **argv)
+{
+    int ret;
+
+    g_test_init(&argc, &argv, NULL);
+    qtest_add_func("/pvpanic-pci/panic", test_panic);
+
+    ret = g_test_run();
+
+    return ret;
+}
-- 
1.8.3.1



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

* Re: [PATCH 4/4] tests/qtest: add a test case for pvpanic-pci
  2021-01-15 18:34 ` [PATCH 4/4] tests/qtest: add a test case for pvpanic-pci Mihai Carabas
@ 2021-01-18  7:42   ` Thomas Huth
  2021-01-19 13:16   ` Peter Maydell
  1 sibling, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2021-01-18  7:42 UTC (permalink / raw)
  To: Mihai Carabas, qemu-devel; +Cc: peter.maydell, kraxel

On 15/01/2021 19.34, Mihai Carabas wrote:
> Add a test case for pvpanic-pci device. The scenario is the same as pvpapnic
> ISA device, but is using the PCI bus.
> 
> Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
> ---
>   tests/qtest/meson.build        |  1 +
>   tests/qtest/pvpanic-pci-test.c | 62 ++++++++++++++++++++++++++++++++++++++++++
>   2 files changed, 63 insertions(+)
>   create mode 100644 tests/qtest/pvpanic-pci-test.c
> 
> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
> index b050289..f689cad 100644
> --- a/tests/qtest/meson.build
> +++ b/tests/qtest/meson.build
> @@ -20,6 +20,7 @@ endif
>   
>   qtests_pci = \
>     (config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : []) +                  \
> +  (config_all_devices.has_key('CONFIG_PVPANIC_PCI') ? ['pvpanic-pci-test'] : []) +          \
>     (config_all_devices.has_key('CONFIG_IVSHMEM_DEVICE') ? ['ivshmem-test'] : [])
>   
>   qtests_i386 = \
> diff --git a/tests/qtest/pvpanic-pci-test.c b/tests/qtest/pvpanic-pci-test.c
> new file mode 100644
> index 0000000..79b8065
> --- /dev/null
> +++ b/tests/qtest/pvpanic-pci-test.c
> @@ -0,0 +1,62 @@
> +/*
> + * QTest testcase for PV Panic PCI device
> + *
> + * Copyright (C) 2020 Oracle
> + *
> + * Authors:
> + *     Mihai Carabas <mihai.carabas@oracle.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + *
> + */
> +
> +#include "qemu/osdep.h"
> +#include "libqos/libqtest.h"
> +#include "qapi/qmp/qdict.h"
> +#include "libqos/pci.h"
> +#include "libqos/pci-pc.h"
> +#include "hw/pci/pci_regs.h"
> +
> +static void test_panic(void)
> +{
> +    uint8_t val;
> +    QDict *response, *data;
> +    QTestState *qts;
> +    QPCIBus *pcibus;
> +    QPCIDevice *dev;
> +    QPCIBar bar;
> +
> +    qts = qtest_init("-device pvpanic-pci");
> +    pcibus = qpci_new_pc(qts, NULL);
> +    dev = qpci_device_find(pcibus, QPCI_DEVFN(0x4, 0x0));
> +    qpci_device_enable(dev);
> +    bar = qpci_iomap(dev, 0, NULL);
> +
> +    qpci_memread(dev, bar, 0, &val, sizeof(val));
> +    g_assert_cmpuint(val, ==, 3);
> +
> +    val = 1;
> +    qpci_memwrite(dev, bar, 0, &val, sizeof(val));
> +
> +    response = qtest_qmp_eventwait_ref(qts, "GUEST_PANICKED");
> +    g_assert(qdict_haskey(response, "data"));
> +    data = qdict_get_qdict(response, "data");
> +    g_assert(qdict_haskey(data, "action"));
> +    g_assert_cmpstr(qdict_get_str(data, "action"), ==, "pause");
> +    qobject_unref(response);
> +
> +    qtest_quit(qts);
> +}
> +
> +int main(int argc, char **argv)
> +{
> +    int ret;
> +
> +    g_test_init(&argc, &argv, NULL);
> +    qtest_add_func("/pvpanic-pci/panic", test_panic);
> +
> +    ret = g_test_run();
> +
> +    return ret;
> +}
> 

Acked-by: Thomas Huth <thuth@redhat.com>



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

* Re: [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
  2021-01-15 18:34 ` [PATCH 2/4] hw/misc/pvpanic: add PCI interface support Mihai Carabas
@ 2021-01-18 10:00   ` Gerd Hoffmann
  2021-01-19 13:14   ` Peter Maydell
  2021-01-20 11:57   ` Yan Vugenfirer
  2 siblings, 0 replies; 19+ messages in thread
From: Gerd Hoffmann @ 2021-01-18 10:00 UTC (permalink / raw)
  To: Mihai Carabas; +Cc: peter.maydell, qemu-devel

> --- a/docs/specs/pci-ids.txt
> +++ b/docs/specs/pci-ids.txt
> @@ -64,6 +64,7 @@ PCI devices (other than virtio):
>  1b36:000d  PCI xhci usb host adapter
>  1b36:000f  mdpy (mdev sample device), linux/samples/vfio-mdev/mdpy.c
>  1b36:0010  PCIe NVMe device (-device nvme)
> +1b36:0011  PCI PVPanic device (-device pvpanic-pci)
>  
>  All these devices are documented in docs/specs.
>  

> diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
> index 259f9c9..66db084 100644
> --- a/include/hw/pci/pci.h
> +++ b/include/hw/pci/pci.h
> @@ -107,6 +107,7 @@ extern bool pci_available;
>  #define PCI_DEVICE_ID_REDHAT_PCIE_BRIDGE 0x000e
>  #define PCI_DEVICE_ID_REDHAT_MDPY        0x000f
>  #define PCI_DEVICE_ID_REDHAT_NVME        0x0010
> +#define PCI_DEVICE_ID_REDHAT_PVPANIC     0x0011
>  #define PCI_DEVICE_ID_REDHAT_QXL         0x0100

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>

take care,
  Gerd



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

* Re: [PATCH 3/4] pvpanic : update pvpanic spec document
  2021-01-15 18:34 ` [PATCH 3/4] pvpanic : update pvpanic spec document Mihai Carabas
@ 2021-01-18 10:32   ` Philippe Mathieu-Daudé
  2021-01-18 14:36     ` Mihai Carabas
  2021-01-19 13:17   ` Peter Maydell
  1 sibling, 1 reply; 19+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-01-18 10:32 UTC (permalink / raw)
  To: Mihai Carabas, qemu-devel; +Cc: peter.maydell, kraxel

On 1/15/21 7:34 PM, Mihai Carabas wrote:
> Add pvpanic PCI device support details in docs/specs/pvpanic.txt.
> 
> Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
> ---
>  docs/specs/pvpanic.txt | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/docs/specs/pvpanic.txt b/docs/specs/pvpanic.txt
> index a90fbca..974aafd 100644
> --- a/docs/specs/pvpanic.txt
> +++ b/docs/specs/pvpanic.txt
> @@ -1,7 +1,7 @@
>  PVPANIC DEVICE
>  ==============
>  
> -pvpanic device is a simulated ISA device, through which a guest panic
> +pvpanic device is a simulated device, through which a guest panic
>  event is sent to qemu, and a QMP event is generated. This allows
>  management apps (e.g. libvirt) to be notified and respond to the event.
>  
> @@ -9,6 +9,9 @@ The management app has the option of waiting for GUEST_PANICKED events,
>  and/or polling for guest-panicked RunState, to learn when the pvpanic
>  device has fired a panic event.
>  
> +The pvpanic device can be implemented as an ISA device (using IOPORT) or as a
> +PCI device.
> +
>  ISA Interface
>  -------------
>  
> @@ -24,6 +27,14 @@ bit 1: a guest panic has happened and will be handled by the guest;
>         the host should record it or report it, but should not affect
>         the execution of the guest.
>  
> +PCI Interface
> +-------------
> +
> +The PCI interface is similar to the ISA interface except that it uses an MMIO
> +address space provided by its BAR0, 1 byte long. Any machine with a PCI device

"device" -> "bus"?

> +can enable a pvpanic device by adding '-device pvpanic-pci' to the command
> +line.
> +
>  ACPI Interface
>  --------------
>  
> 



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

* Re: [PATCH 3/4] pvpanic : update pvpanic spec document
  2021-01-18 10:32   ` Philippe Mathieu-Daudé
@ 2021-01-18 14:36     ` Mihai Carabas
  0 siblings, 0 replies; 19+ messages in thread
From: Mihai Carabas @ 2021-01-18 14:36 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel; +Cc: peter.maydell, kraxel

La 18.01.2021 12:32, Philippe Mathieu-Daudé a scris:
> On 1/15/21 7:34 PM, Mihai Carabas wrote:
>> Add pvpanic PCI device support details in docs/specs/pvpanic.txt.
>>
>> Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
>> ---
>>   docs/specs/pvpanic.txt | 13 ++++++++++++-
>>   1 file changed, 12 insertions(+), 1 deletion(-)
>>
>> diff --git a/docs/specs/pvpanic.txt b/docs/specs/pvpanic.txt
>> index a90fbca..974aafd 100644
>> --- a/docs/specs/pvpanic.txt
>> +++ b/docs/specs/pvpanic.txt
>> @@ -1,7 +1,7 @@
>>   PVPANIC DEVICE
>>   ==============
>>   
>> -pvpanic device is a simulated ISA device, through which a guest panic
>> +pvpanic device is a simulated device, through which a guest panic
>>   event is sent to qemu, and a QMP event is generated. This allows
>>   management apps (e.g. libvirt) to be notified and respond to the event.
>>   
>> @@ -9,6 +9,9 @@ The management app has the option of waiting for GUEST_PANICKED events,
>>   and/or polling for guest-panicked RunState, to learn when the pvpanic
>>   device has fired a panic event.
>>   
>> +The pvpanic device can be implemented as an ISA device (using IOPORT) or as a
>> +PCI device.
>> +
>>   ISA Interface
>>   -------------
>>   
>> @@ -24,6 +27,14 @@ bit 1: a guest panic has happened and will be handled by the guest;
>>          the host should record it or report it, but should not affect
>>          the execution of the guest.
>>   
>> +PCI Interface
>> +-------------
>> +
>> +The PCI interface is similar to the ISA interface except that it uses an MMIO
>> +address space provided by its BAR0, 1 byte long. Any machine with a PCI device
> 
> "device" -> "bus"?

You are right. I will update. Thanks!

> 
>> +can enable a pvpanic device by adding '-device pvpanic-pci' to the command
>> +line.
>> +
>>   ACPI Interface
>>   --------------
>>   
>>
> 



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

* Re: [PATCH 1/4] hw/misc/pvpanic: split-out generic and bus dependent code
  2021-01-15 18:34 ` [PATCH 1/4] hw/misc/pvpanic: split-out generic and bus dependent code Mihai Carabas
@ 2021-01-19 13:12   ` Peter Maydell
  0 siblings, 0 replies; 19+ messages in thread
From: Peter Maydell @ 2021-01-19 13:12 UTC (permalink / raw)
  To: Mihai Carabas; +Cc: QEMU Developers, Gerd Hoffmann

On Fri, 15 Jan 2021 at 19:21, Mihai Carabas <mihai.carabas@oracle.com> wrote:
>
> To ease the PCI device addition in next patches, split the code as follows:
> - generic code (read/write/setup) is being kept in pvpanic.c
> - ISA dependent code moved to pvpanic-isa.c
>
> Also, rename:
> - ISA_PVPANIC_DEVICE -> PVPANIC_ISA_DEVICE.
> - TYPE_PVPANIC -> TYPE_PVPANIC_ISA.
> - MemoryRegion io -> mr.
> - pvpanic_ioport_* in pvpanic_*.
>
> Update the build system with the new files and config structure.
>
> Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>

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

thanks
-- PMM


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

* Re: [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
  2021-01-15 18:34 ` [PATCH 2/4] hw/misc/pvpanic: add PCI interface support Mihai Carabas
  2021-01-18 10:00   ` Gerd Hoffmann
@ 2021-01-19 13:14   ` Peter Maydell
  2021-01-20 11:57   ` Yan Vugenfirer
  2 siblings, 0 replies; 19+ messages in thread
From: Peter Maydell @ 2021-01-19 13:14 UTC (permalink / raw)
  To: Mihai Carabas; +Cc: QEMU Developers, Gerd Hoffmann

On Fri, 15 Jan 2021 at 19:23, Mihai Carabas <mihai.carabas@oracle.com> wrote:
>
> Add PCI interface support for PVPANIC device. Create a new file pvpanic-pci.c
> where the PCI specific routines reside and update the build system with the new
> files and config structure.
>
> Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>

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

thanks
-- PMM


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

* Re: [PATCH 4/4] tests/qtest: add a test case for pvpanic-pci
  2021-01-15 18:34 ` [PATCH 4/4] tests/qtest: add a test case for pvpanic-pci Mihai Carabas
  2021-01-18  7:42   ` Thomas Huth
@ 2021-01-19 13:16   ` Peter Maydell
  1 sibling, 0 replies; 19+ messages in thread
From: Peter Maydell @ 2021-01-19 13:16 UTC (permalink / raw)
  To: Mihai Carabas; +Cc: QEMU Developers, Gerd Hoffmann

On Fri, 15 Jan 2021 at 19:23, Mihai Carabas <mihai.carabas@oracle.com> wrote:
>
> Add a test case for pvpanic-pci device. The scenario is the same as pvpapnic

"pvpanic"

> ISA device, but is using the PCI bus.
>
> Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>

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

thanks
-- PMM


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

* Re: [PATCH 3/4] pvpanic : update pvpanic spec document
  2021-01-15 18:34 ` [PATCH 3/4] pvpanic : update pvpanic spec document Mihai Carabas
  2021-01-18 10:32   ` Philippe Mathieu-Daudé
@ 2021-01-19 13:17   ` Peter Maydell
  1 sibling, 0 replies; 19+ messages in thread
From: Peter Maydell @ 2021-01-19 13:17 UTC (permalink / raw)
  To: Mihai Carabas; +Cc: QEMU Developers, Gerd Hoffmann

On Fri, 15 Jan 2021 at 19:23, Mihai Carabas <mihai.carabas@oracle.com> wrote:
>
> Add pvpanic PCI device support details in docs/specs/pvpanic.txt.
>
> Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
> ---
>  docs/specs/pvpanic.txt | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/docs/specs/pvpanic.txt b/docs/specs/pvpanic.txt
> index a90fbca..974aafd 100644
> --- a/docs/specs/pvpanic.txt
> +++ b/docs/specs/pvpanic.txt
> @@ -1,7 +1,7 @@
>  PVPANIC DEVICE
>  ==============
>
> -pvpanic device is a simulated ISA device, through which a guest panic
> +pvpanic device is a simulated device, through which a guest panic
>  event is sent to qemu, and a QMP event is generated. This allows
>  management apps (e.g. libvirt) to be notified and respond to the event.
>
> @@ -9,6 +9,9 @@ The management app has the option of waiting for GUEST_PANICKED events,
>  and/or polling for guest-panicked RunState, to learn when the pvpanic
>  device has fired a panic event.
>
> +The pvpanic device can be implemented as an ISA device (using IOPORT) or as a
> +PCI device.
> +
>  ISA Interface
>  -------------
>
> @@ -24,6 +27,14 @@ bit 1: a guest panic has happened and will be handled by the guest;
>         the host should record it or report it, but should not affect
>         the execution of the guest.
>
> +PCI Interface
> +-------------
> +
> +The PCI interface is similar to the ISA interface except that it uses an MMIO
> +address space provided by its BAR0, 1 byte long. Any machine with a PCI device
> +can enable a pvpanic device by adding '-device pvpanic-pci' to the command
> +line.
> +

Other than the s/device/bus/ that Philippe pointed out,
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


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

* Re: [PATCH v3] Add support for pvpanic pci device
  2021-01-15 18:34 [PATCH v3] Add support for pvpanic pci device Mihai Carabas
                   ` (3 preceding siblings ...)
  2021-01-15 18:34 ` [PATCH 4/4] tests/qtest: add a test case for pvpanic-pci Mihai Carabas
@ 2021-01-19 13:29 ` Peter Maydell
  2021-01-19 15:44   ` Peter Maydell
  4 siblings, 1 reply; 19+ messages in thread
From: Peter Maydell @ 2021-01-19 13:29 UTC (permalink / raw)
  To: Mihai Carabas; +Cc: QEMU Developers, Gerd Hoffmann

On Fri, 15 Jan 2021 at 19:21, Mihai Carabas <mihai.carabas@oracle.com> wrote:
>
> This patchset adds support for pvpanic pci device.
>
> v3 applied feedback:
>
> - patch 1: made pvpanic isa device available only for PC, compile pvpanic-test
>   only when isa device is present
>
> - patch 2: fixed device id to 0x0011, used OBJECT_DECLARE_TYPE,
>   PVPANIC_PCI_DEVICE, added VMSTATE_PCI_DEVICE, removed INTERFACE_PCIE_DEVICE
>
> - patch 3: fixed documentation
>
> - patch 4: add a qtest for pvpanic-pci
>
> Mihai Carabas (4):
>   hw/misc/pvpanic: split-out generic and bus dependent code
>   hw/misc/pvpanic: add PCI interface support
>   pvpanic : update pvpanic spec document
>   tests/qtest: add a test case for pvpanic-pci

Since the only issue in this version was a minor thinko in
the docs, I'm going to apply this to target-arm.next and
make that s/device/bus/ docs fix there. (target-arm seems like
a reasonable queue to use since the main reason for having
this device is for the virt board.)

thanks
-- PMM


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

* Re: [PATCH v3] Add support for pvpanic pci device
  2021-01-19 13:29 ` [PATCH v3] Add support for pvpanic pci device Peter Maydell
@ 2021-01-19 15:44   ` Peter Maydell
  0 siblings, 0 replies; 19+ messages in thread
From: Peter Maydell @ 2021-01-19 15:44 UTC (permalink / raw)
  To: Mihai Carabas; +Cc: QEMU Developers, Gerd Hoffmann

On Tue, 19 Jan 2021 at 13:29, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Fri, 15 Jan 2021 at 19:21, Mihai Carabas <mihai.carabas@oracle.com> wrote:
> >
> > This patchset adds support for pvpanic pci device.
> >
> > v3 applied feedback:
> >
> > - patch 1: made pvpanic isa device available only for PC, compile pvpanic-test
> >   only when isa device is present
> >
> > - patch 2: fixed device id to 0x0011, used OBJECT_DECLARE_TYPE,
> >   PVPANIC_PCI_DEVICE, added VMSTATE_PCI_DEVICE, removed INTERFACE_PCIE_DEVICE
> >
> > - patch 3: fixed documentation
> >
> > - patch 4: add a qtest for pvpanic-pci
> >
> > Mihai Carabas (4):
> >   hw/misc/pvpanic: split-out generic and bus dependent code
> >   hw/misc/pvpanic: add PCI interface support
> >   pvpanic : update pvpanic spec document
> >   tests/qtest: add a test case for pvpanic-pci
>
> Since the only issue in this version was a minor thinko in
> the docs, I'm going to apply this to target-arm.next and
> make that s/device/bus/ docs fix there. (target-arm seems like
> a reasonable queue to use since the main reason for having
> this device is for the virt board.)

It turns out that the new pvpanic-pci-test fails for i386 targets:

Running test qtest-i386/pvpanic-pci-test
**
ERROR:../../tests/qtest/pvpanic-pci-test.c:46:test_panic: assertion
failed (qdict_get_str(data, "action") == "pause"): ("poweroff" ==
"pause")
ERROR qtest-i386/pvpanic-pci-test - Bail out!
ERROR:../../tests/qtest/pvpanic-pci-test.c:46:test_panic: assertion
failed (qdict_get_str(data, "action") == "pause"): ("poweroff" ==
"pause")

So I'm dropping it from my target-arm.next queue; could you investigate
the issue, please?

thanks
-- PMM


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

* Re: [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
  2021-01-15 18:34 ` [PATCH 2/4] hw/misc/pvpanic: add PCI interface support Mihai Carabas
  2021-01-18 10:00   ` Gerd Hoffmann
  2021-01-19 13:14   ` Peter Maydell
@ 2021-01-20 11:57   ` Yan Vugenfirer
  2021-01-20 12:49     ` Mihai Carabas
  2021-01-20 13:43     ` Gerd Hoffmann
  2 siblings, 2 replies; 19+ messages in thread
From: Yan Vugenfirer @ 2021-01-20 11:57 UTC (permalink / raw)
  To: Mihai Carabas; +Cc: peter.maydell, QEMU Devel Mailing List, kraxel



> On 15 Jan 2021, at 8:34 PM, Mihai Carabas <mihai.carabas@oracle.com> wrote:
> 
> Add PCI interface support for PVPANIC device. Create a new file pvpanic-pci.c
> where the PCI specific routines reside and update the build system with the new
> files and config structure.
> 
> Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
> ---
> docs/specs/pci-ids.txt    |  1 +
> hw/misc/Kconfig           |  6 +++
> hw/misc/meson.build       |  1 +
> hw/misc/pvpanic-pci.c     | 94 +++++++++++++++++++++++++++++++++++++++++++++++
> include/hw/misc/pvpanic.h |  1 +
> include/hw/pci/pci.h      |  1 +
> 6 files changed, 104 insertions(+)
> create mode 100644 hw/misc/pvpanic-pci.c
> 
> diff --git a/docs/specs/pci-ids.txt b/docs/specs/pci-ids.txt
> index abbdbca..5e407a6 100644
> --- a/docs/specs/pci-ids.txt
> +++ b/docs/specs/pci-ids.txt
> @@ -64,6 +64,7 @@ PCI devices (other than virtio):
> 1b36:000d  PCI xhci usb host adapter
> 1b36:000f  mdpy (mdev sample device), linux/samples/vfio-mdev/mdpy.c
> 1b36:0010  PCIe NVMe device (-device nvme)
> +1b36:0011  PCI PVPanic device (-device pvpanic-pci)
> 
> All these devices are documented in docs/specs.
> 
> diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
> index 23bc978..19c216f 100644
> --- a/hw/misc/Kconfig
> +++ b/hw/misc/Kconfig
> @@ -124,6 +124,12 @@ config IOTKIT_SYSINFO
> config PVPANIC_COMMON
>    bool
> 
> +config PVPANIC_PCI
> +    bool
> +    default y if PCI_DEVICES
> +    depends on PCI
> +    select PVPANIC_COMMON
> +
> config PVPANIC_ISA
>    bool
>    depends on ISA_BUS
> diff --git a/hw/misc/meson.build b/hw/misc/meson.build
> index 8c828ad..f686019 100644
> --- a/hw/misc/meson.build
> +++ b/hw/misc/meson.build
> @@ -99,6 +99,7 @@ softmmu_ss.add(when: 'CONFIG_ARMSSE_CPUID', if_true: files('armsse-cpuid.c'))
> softmmu_ss.add(when: 'CONFIG_ARMSSE_MHU', if_true: files('armsse-mhu.c'))
> 
> softmmu_ss.add(when: 'CONFIG_PVPANIC_ISA', if_true: files('pvpanic-isa.c'))
> +softmmu_ss.add(when: 'CONFIG_PVPANIC_PCI', if_true: files('pvpanic-pci.c'))
> softmmu_ss.add(when: 'CONFIG_AUX', if_true: files('auxbus.c'))
> softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_scu.c', 'aspeed_sdmc.c', 'aspeed_xdma.c'))
> softmmu_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-sysreg.c'))
> diff --git a/hw/misc/pvpanic-pci.c b/hw/misc/pvpanic-pci.c
> new file mode 100644
> index 0000000..d629639
> --- /dev/null
> +++ b/hw/misc/pvpanic-pci.c
> @@ -0,0 +1,94 @@
> +/*
> + * QEMU simulated PCI pvpanic device.
> + *
> + * Copyright (C) 2020 Oracle
> + *
> + * Authors:
> + *     Mihai Carabas <mihai.carabas@oracle.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + *
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qemu/log.h"
> +#include "qemu/module.h"
> +#include "sysemu/runstate.h"
> +
> +#include "hw/nvram/fw_cfg.h"
> +#include "hw/qdev-properties.h"
> +#include "migration/vmstate.h"
> +#include "hw/misc/pvpanic.h"
> +#include "qom/object.h"
> +#include "hw/pci/pci.h"
> +
> +OBJECT_DECLARE_SIMPLE_TYPE(PVPanicPCIState, PVPANIC_PCI_DEVICE)
> +
> +/*
> + * PVPanicPCIState for PCI device
> + */
> +typedef struct PVPanicPCIState {
> +    PCIDevice dev;
> +    PVPanicState pvpanic;
> +} PVPanicPCIState;
> +
> +static const VMStateDescription vmstate_pvpanic_pci = {
> +    .name = "pvpanic-pci",
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .fields = (VMStateField[]) {
> +        VMSTATE_PCI_DEVICE(dev, PVPanicPCIState),
> +        VMSTATE_END_OF_LIST()
> +    }
> +};
> +
> +static void pvpanic_pci_realizefn(PCIDevice *dev, Error **errp)
> +{
> +    PVPanicPCIState *s = PVPANIC_PCI_DEVICE(dev);
> +    PVPanicState *ps = &s->pvpanic;
> +
> +    pvpanic_setup_io(&s->pvpanic, DEVICE(s), 2);
> +
> +    pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &ps->mr);
> +}
> +
> +static Property pvpanic_pci_properties[] = {
> +    DEFINE_PROP_UINT8("events", PVPanicPCIState, pvpanic.events, PVPANIC_PANICKED | PVPANIC_CRASHLOADED),
> +    DEFINE_PROP_END_OF_LIST(),
> +};
> +
> +static void pvpanic_pci_class_init(ObjectClass *klass, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +    PCIDeviceClass *pc = PCI_DEVICE_CLASS(klass);
> +
> +    device_class_set_props(dc, pvpanic_pci_properties);
> +
> +    pc->realize = pvpanic_pci_realizefn;
> +    pc->vendor_id = PCI_VENDOR_ID_REDHAT;
> +    pc->device_id = PCI_DEVICE_ID_REDHAT_PVPANIC;

Please fill out subsystem and subsystem vendor IDs as well:
pc->subsystem_vendor_id
pc->subsystem_id 

It is needed in order to pass MS WHQL tests. Requirement name “Device.Connectivity.PciConnected.SubsystemIdsRequired” in "Windows Hardware Compatibility Specifications – Components and Peripherals” document.
https://docs.microsoft.com/en-us/windows-hardware/design/compatibility/whcp-specifications-policies

Thanks,
Yan.

> +    pc->revision = 1;
> +    pc->class_id = PCI_CLASS_SYSTEM_OTHER;
> +    dc->vmsd = &vmstate_pvpanic_pci;
> +
> +    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
> +}
> +
> +static TypeInfo pvpanic_pci_info = {
> +    .name          = TYPE_PVPANIC_PCI_DEVICE,
> +    .parent        = TYPE_PCI_DEVICE,
> +    .instance_size = sizeof(PVPanicPCIState),
> +    .class_init    = pvpanic_pci_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { INTERFACE_CONVENTIONAL_PCI_DEVICE },
> +        { }
> +    }
> +};
> +
> +static void pvpanic_register_types(void)
> +{
> +    type_register_static(&pvpanic_pci_info);
> +}
> +
> +type_init(pvpanic_register_types);
> diff --git a/include/hw/misc/pvpanic.h b/include/hw/misc/pvpanic.h
> index abc9dde..ca3c5bb 100644
> --- a/include/hw/misc/pvpanic.h
> +++ b/include/hw/misc/pvpanic.h
> @@ -18,6 +18,7 @@
> #include "qom/object.h"
> 
> #define TYPE_PVPANIC_ISA_DEVICE "pvpanic"
> +#define TYPE_PVPANIC_PCI_DEVICE "pvpanic-pci"
> 
> #define PVPANIC_IOPORT_PROP "ioport"
> 
> diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
> index 259f9c9..66db084 100644
> --- a/include/hw/pci/pci.h
> +++ b/include/hw/pci/pci.h
> @@ -107,6 +107,7 @@ extern bool pci_available;
> #define PCI_DEVICE_ID_REDHAT_PCIE_BRIDGE 0x000e
> #define PCI_DEVICE_ID_REDHAT_MDPY        0x000f
> #define PCI_DEVICE_ID_REDHAT_NVME        0x0010
> +#define PCI_DEVICE_ID_REDHAT_PVPANIC     0x0011
> #define PCI_DEVICE_ID_REDHAT_QXL         0x0100
> 
> #define FMT_PCIBUS                      PRIx64
> -- 
> 1.8.3.1
> 
> 



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

* Re: [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
  2021-01-20 11:57   ` Yan Vugenfirer
@ 2021-01-20 12:49     ` Mihai Carabas
  2021-01-20 13:43     ` Gerd Hoffmann
  1 sibling, 0 replies; 19+ messages in thread
From: Mihai Carabas @ 2021-01-20 12:49 UTC (permalink / raw)
  To: Yan Vugenfirer; +Cc: peter.maydell, QEMU Devel Mailing List, kraxel


>> +    device_class_set_props(dc, pvpanic_pci_properties);
>> +
>> +    pc->realize = pvpanic_pci_realizefn;
>> +    pc->vendor_id = PCI_VENDOR_ID_REDHAT;
>> +    pc->device_id = PCI_DEVICE_ID_REDHAT_PVPANIC;
> Please fill out subsystem and subsystem vendor IDs as well:
> pc->subsystem_vendor_id
> pc->subsystem_id
Will send v5 now with these info filled out.


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

* Re: [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
  2021-01-20 11:57   ` Yan Vugenfirer
  2021-01-20 12:49     ` Mihai Carabas
@ 2021-01-20 13:43     ` Gerd Hoffmann
  2021-01-20 14:05       ` Mihai Carabas
  1 sibling, 1 reply; 19+ messages in thread
From: Gerd Hoffmann @ 2021-01-20 13:43 UTC (permalink / raw)
  To: Yan Vugenfirer; +Cc: Mihai Carabas, peter.maydell, QEMU Devel Mailing List

  Hi,

> > +    pc->realize = pvpanic_pci_realizefn;
> > +    pc->vendor_id = PCI_VENDOR_ID_REDHAT;
> > +    pc->device_id = PCI_DEVICE_ID_REDHAT_PVPANIC;
> 
> Please fill out subsystem and subsystem vendor IDs as well:
> pc->subsystem_vendor_id
> pc->subsystem_id 

Not needed, when left blank they are set to the default
qemu subsystem id (1af4:1100) by the pci core.

take care,
  Gerd



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

* Re: [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
  2021-01-20 13:43     ` Gerd Hoffmann
@ 2021-01-20 14:05       ` Mihai Carabas
  0 siblings, 0 replies; 19+ messages in thread
From: Mihai Carabas @ 2021-01-20 14:05 UTC (permalink / raw)
  To: Gerd Hoffmann, Yan Vugenfirer; +Cc: peter.maydell, QEMU Devel Mailing List

La 20.01.2021 15:43, Gerd Hoffmann a scris:
>    Hi,
>
>>> +    pc->realize = pvpanic_pci_realizefn;
>>> +    pc->vendor_id = PCI_VENDOR_ID_REDHAT;
>>> +    pc->device_id = PCI_DEVICE_ID_REDHAT_PVPANIC;
>> Please fill out subsystem and subsystem vendor IDs as well:
>> pc->subsystem_vendor_id
>> pc->subsystem_id
> Not needed, when left blank they are set to the default
> qemu subsystem id (1af4:1100) by the pci core.

Thank you!

@Peter: You can grab v4 if this is not needed.



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

end of thread, other threads:[~2021-01-20 14:09 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-15 18:34 [PATCH v3] Add support for pvpanic pci device Mihai Carabas
2021-01-15 18:34 ` [PATCH 1/4] hw/misc/pvpanic: split-out generic and bus dependent code Mihai Carabas
2021-01-19 13:12   ` Peter Maydell
2021-01-15 18:34 ` [PATCH 2/4] hw/misc/pvpanic: add PCI interface support Mihai Carabas
2021-01-18 10:00   ` Gerd Hoffmann
2021-01-19 13:14   ` Peter Maydell
2021-01-20 11:57   ` Yan Vugenfirer
2021-01-20 12:49     ` Mihai Carabas
2021-01-20 13:43     ` Gerd Hoffmann
2021-01-20 14:05       ` Mihai Carabas
2021-01-15 18:34 ` [PATCH 3/4] pvpanic : update pvpanic spec document Mihai Carabas
2021-01-18 10:32   ` Philippe Mathieu-Daudé
2021-01-18 14:36     ` Mihai Carabas
2021-01-19 13:17   ` Peter Maydell
2021-01-15 18:34 ` [PATCH 4/4] tests/qtest: add a test case for pvpanic-pci Mihai Carabas
2021-01-18  7:42   ` Thomas Huth
2021-01-19 13:16   ` Peter Maydell
2021-01-19 13:29 ` [PATCH v3] Add support for pvpanic pci device Peter Maydell
2021-01-19 15:44   ` Peter Maydell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).