Alexey Kardashevskiy <a...@ozlabs.ru> writes: > From: David Gibson <da...@gibson.dropbear.id.au> > > This adds the necessary support for saving the state of the PAPR virtual > PCI host bridge (or host bridges). > > Signed-off-by: David Gibson <da...@gibson.dropbear.id.au> > Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru>
Reviewed-by: Anthony Liguori <aligu...@us.ibm.com> Regards, Anthony Liguori > --- > hw/ppc/spapr_pci.c | 49 > +++++++++++++++++++++++++++++++++++++++++++ > include/hw/pci-host/spapr.h | 6 +++--- > 2 files changed, 52 insertions(+), 3 deletions(-) > > diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c > index c8c12c8..4d8e3cd 100644 > --- a/hw/ppc/spapr_pci.c > +++ b/hw/ppc/spapr_pci.c > @@ -696,6 +696,54 @@ static Property spapr_phb_properties[] = { > DEFINE_PROP_END_OF_LIST(), > }; > > +static const VMStateDescription vmstate_spapr_pci_lsi = { > + .name = "spapr_pci/lsi", > + .version_id = 1, > + .minimum_version_id = 1, > + .minimum_version_id_old = 1, > + .fields = (VMStateField []) { > + VMSTATE_UINT32_EQUAL(irq, struct spapr_pci_lsi), > + > + VMSTATE_END_OF_LIST() > + }, > +}; > + > +static const VMStateDescription vmstate_spapr_pci_msi = { > + .name = "spapr_pci/lsi", > + .version_id = 1, > + .minimum_version_id = 1, > + .minimum_version_id_old = 1, > + .fields = (VMStateField []) { > + VMSTATE_UINT32(config_addr, struct spapr_pci_msi), > + VMSTATE_UINT32(irq, struct spapr_pci_msi), > + VMSTATE_UINT32(nvec, struct spapr_pci_msi), > + > + VMSTATE_END_OF_LIST() > + }, > +}; > + > +static const VMStateDescription vmstate_spapr_pci = { > + .name = "spapr_pci", > + .version_id = 1, > + .minimum_version_id = 1, > + .minimum_version_id_old = 1, > + .fields = (VMStateField []) { > + VMSTATE_UINT64_EQUAL(buid, sPAPRPHBState), > + VMSTATE_UINT32_EQUAL(dma_liobn, sPAPRPHBState), > + VMSTATE_UINT64_EQUAL(mem_win_addr, sPAPRPHBState), > + VMSTATE_UINT64_EQUAL(mem_win_size, sPAPRPHBState), > + VMSTATE_UINT64_EQUAL(io_win_addr, sPAPRPHBState), > + VMSTATE_UINT64_EQUAL(io_win_size, sPAPRPHBState), > + VMSTATE_UINT64_EQUAL(msi_win_addr, sPAPRPHBState), > + VMSTATE_STRUCT_ARRAY(lsi_table, sPAPRPHBState, PCI_NUM_PINS, 0, > + vmstate_spapr_pci_lsi, struct spapr_pci_lsi), > + VMSTATE_STRUCT_ARRAY(msi_table, sPAPRPHBState, SPAPR_MSIX_MAX_DEVS, > 0, > + vmstate_spapr_pci_msi, struct spapr_pci_msi), > + > + VMSTATE_END_OF_LIST() > + }, > +}; > + > static void spapr_phb_class_init(ObjectClass *klass, void *data) > { > SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass); > @@ -704,6 +752,7 @@ static void spapr_phb_class_init(ObjectClass *klass, void > *data) > sdc->init = spapr_phb_init; > dc->props = spapr_phb_properties; > dc->reset = spapr_phb_reset; > + dc->vmsd = &vmstate_spapr_pci; > } > > static const TypeInfo spapr_phb_info = { > diff --git a/include/hw/pci-host/spapr.h b/include/hw/pci-host/spapr.h > index 1e23dbf..93f9511 100644 > --- a/include/hw/pci-host/spapr.h > +++ b/include/hw/pci-host/spapr.h > @@ -52,14 +52,14 @@ typedef struct sPAPRPHBState { > sPAPRTCETable *tcet; > AddressSpace iommu_as; > > - struct { > + struct spapr_pci_lsi { > uint32_t irq; > } lsi_table[PCI_NUM_PINS]; > > - struct { > + struct spapr_pci_msi { > uint32_t config_addr; > uint32_t irq; > - int nvec; > + uint32_t nvec; > } msi_table[SPAPR_MSIX_MAX_DEVS]; > > QLIST_ENTRY(sPAPRPHBState) list; > -- > 1.7.10.4