Message ID | 1610735646-13313-3-git-send-email-mihai.carabas@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/4] hw/misc/pvpanic: split-out generic and bus dependent code | expand |
> --- 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
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
> 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 > >
>> + 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.
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
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.
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
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