[PATCH 2/4] hw/misc/pvpanic: add PCI interface support
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 --- 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 000..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 + * + * 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_
Re: [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
> --- 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_MDPY0x000f > #define PCI_DEVICE_ID_REDHAT_NVME0x0010 > +#define PCI_DEVICE_ID_REDHAT_PVPANIC 0x0011 > #define PCI_DEVICE_ID_REDHAT_QXL 0x0100 Reviewed-by: Gerd Hoffmann take care, Gerd
Re: [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
On Fri, 15 Jan 2021 at 19:23, Mihai Carabas 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 Reviewed-by: Peter Maydell thanks -- PMM
Re: [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
> On 15 Jan 2021, at 8:34 PM, Mihai Carabas 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 > --- > 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 000..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 > + * > + * 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->ca
Re: [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
+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.
Re: [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
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
Re: [PATCH 2/4] hw/misc/pvpanic: add PCI interface support
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.