hw/pcie: fix the generic pcie root port to support migration
PATCH v2 1/1 hw/pcie: fix the generic pcie root port to support migration
Add msix state to pcie-root-ports's vmstate
in order to support migration.
---
v1 -> v2:
- Added x-migrate-msix compat property to avoid
breaking migration (Dave)
hw/pci-bridge/gen_pcie_root_port.c | 25 +++++++++++++++++++++++++ include/hw/compat.h | 4 ++++ 2 files changed, 29 insertions(+)
hw/pci-bridge/gen_pcie_root_port.c +25 -0
@@ -20,6 +20,14 @@#define GEN_PCIE_ROOT_PORT_AER_OFFSET 0x100#define GEN_PCIE_ROOT_PORT_MSIX_NR_VECTOR 1 +typedef struct GenPCIERootPort { +/*< private >*/ +PCIESlot parent_obj; +/*< public >*/ + +bool migrate_msix; +}GenPCIERootPort ; +static uint8_t gen_rp_aer_vector (const PCIDevice *d) {return 0 ;
@@ -45,6 +53,13 @@ static void gen_rp_interrupts_uninit(PCIDevice *d)msix_uninit_exclusive_bar (d); } +static bool gen_rp_test_migrate_msix (void *opaque,int version_id) +{ +GenPCIERootPort *rp = opaque; + +return rp->migrate_msix; +} +static const VMStateDescription vmstate_rp_dev = { .name ="pcie-root-port" , .version_id =1 ,
@@ -54,10 +69,18 @@ static const VMStateDescription vmstate_rp_dev = {VMSTATE_PCI_DEVICE (parent_obj.parent_obj.parent_obj, PCIESlot),VMSTATE_STRUCT (parent_obj.parent_obj.parent_obj.exp.aer_log, PCIESlot,0 , vmstate_pcie_aer_log, PCIEAERLog), +VMSTATE_MSIX_TEST (parent_obj.parent_obj.parent_obj.parent_obj, + GenPCIERootPort, + gen_rp_test_migrate_msix), VMSTATE_END_OF_LIST() } }; +static Property gen_rp_props[] = { +DEFINE_PROP_BOOL ("x-migrate-msix" , GenPCIERootPort, migrate_msix, true), +DEFINE_PROP_END_OF_LIST () +}; +static void gen_rp_dev_class_init (ObjectClass *klass,void *data) {DeviceClass *dc =DEVICE_CLASS (klass);
@@ -68,6 +91,7 @@ static void gen_rp_dev_class_init(ObjectClass *klass, void *data) k->device_id =PCI_DEVICE_ID_REDHAT_PCIE_RP ; dc->desc ="PCI Express Root Port" ; dc->vmsd = &vmstate_rp_dev; + dc->props = gen_rp_props; rpc->aer_vector = gen_rp_aer_vector; rpc->interrupts_init = gen_rp_interrupts_init; rpc->interrupts_uninit = gen_rp_interrupts_uninit;
@@ -77,6 +101,7 @@ static void gen_rp_dev_class_init(ObjectClass *klass, void *data)static const TypeInfo gen_rp_dev_info = { .name =TYPE_GEN_PCIE_ROOT_PORT , .parent =TYPE_PCIE_ROOT_PORT , + .instance_size =sizeof (GenPCIERootPort), .class_init = gen_rp_dev_class_init, };
include/hw/compat.h +4 -0
@@ -6,6 +6,10 @@ .driver = "pci-bridge",\ .property = "shpc",\ .value = "off",\ + },{\ + .driver = "pcie-root-port",\ + .property = "x-migrate-msix",\ + .value = "false",\ },#define HW_COMPAT_2_8 \
Signature · 1 line
2.9.4
Quoted 47 lines · * Marcel Apfelbaum ([email protected]) wrote:
Add msix state to pcie-root-ports's vmstate
in order to support migration.Signed-off-by Marcel Apfelbaum <[email protected]>---
v1 -> v2:
- Added x-migrate-msix compat property to avoid
breaking migration (Dave)hw/pci-bridge/gen_pcie_root_port.c | 25 +++++++++++++++++++++++++ include/hw/compat.h | 4 ++++ 2 files changed, 29 insertions(+)hw/pci-bridge/gen_pcie_root_port.c +15
-0@@ -20,6 +20,14 @@#define GEN_PCIE_ROOT_PORT_AER_OFFSET 0x100#define GEN_PCIE_ROOT_PORT_MSIX_NR_VECTOR 1 +typedef struct GenPCIERootPort { +/*< private >*/ +PCIESlot parent_obj; +/*< public >*/ + +bool migrate_msix; +}GenPCIERootPort ; +static uint8_t gen_rp_aer_vector (const PCIDevice *d) {return 0 ;@@ -45,6 +53,13 @@ static void gen_rp_interrupts_uninit(PCIDevice *d)msix_uninit_exclusive_bar (d); } +static bool gen_rp_test_migrate_msix (void *opaque,int version_id) +{ +GenPCIERootPort *rp = opaque; + +return rp->migrate_msix; +} +static const VMStateDescription vmstate_rp_dev = { .name ="pcie-root-port" , .version_id =1 ,
hw/pci-bridge/gen_pcie_root_port.c static const VMStateDescription vmstate_rp_dev = { · line 74
Quoted 6 lines
hw/pci-bridge/gen_pcie_root_port.c +3
-0@@ -54,10 +69,18 @@ static const VMStateDescription vmstate_rp_dev = {VMSTATE_PCI_DEVICE (parent_obj.parent_obj.parent_obj, PCIESlot),VMSTATE_STRUCT (parent_obj.parent_obj.parent_obj.exp.aer_log, PCIESlot,0 , vmstate_pcie_aer_log, PCIEAERLog), +VMSTATE_MSIX_TEST (parent_obj.parent_obj.parent_obj.parent_obj, + GenPCIERootPort, + gen_rp_test_migrate_msix),
So that's GenPCIERootPort,
parent_obj is PCIESlot
parent_obj is PCIEPort
parent_obj is PCIEBridge
parent_obj is PCIDevice
and msix_save is expecting a PCIDevice, so yep.
Quoted 33 lines
hw/pci-bridge/gen_pcie_root_port.c +7
-0VMSTATE_END_OF_LIST() } }; +static Property gen_rp_props[] = { +DEFINE_PROP_BOOL ("x-migrate-msix" , GenPCIERootPort, migrate_msix, true), +DEFINE_PROP_END_OF_LIST () +}; +static void gen_rp_dev_class_init (ObjectClass *klass,void *data) {DeviceClass *dc =DEVICE_CLASS (klass);@@ -68,6 +91,7 @@ static void gen_rp_dev_class_init(ObjectClass *klass, void *data) k->device_id =PCI_DEVICE_ID_REDHAT_PCIE_RP ; dc->desc ="PCI Express Root Port" ; dc->vmsd = &vmstate_rp_dev; + dc->props = gen_rp_props; rpc->aer_vector = gen_rp_aer_vector; rpc->interrupts_init = gen_rp_interrupts_init; rpc->interrupts_uninit = gen_rp_interrupts_uninit;@@ -77,6 +101,7 @@ static void gen_rp_dev_class_init(ObjectClass *klass, void *data)static const TypeInfo gen_rp_dev_info = { .name =TYPE_GEN_PCIE_ROOT_PORT , .parent =TYPE_PCIE_ROOT_PORT , + .instance_size =sizeof (GenPCIERootPort), .class_init = gen_rp_dev_class_init, };include/hw/compat.h +0
-0
include/hw/compat.h line 12
Quoted 7 lines
include/hw/compat.h +4
-0@@ -6,6 +6,10 @@ .driver = "pci-bridge",\ .property = "shpc",\ .value = "off",\ + },{\ + .driver = "pcie-root-port",\ + .property = "x-migrate-msix",\ + .value = "false",\
You could lose the x- but that's OK.
Quoted 6 lines
include/hw/compat.h +0
-0},#define HW_COMPAT_2_8 \Signature · 1 line
2.9.4
--
Dr. David Alan Gilbert / [email protected] / Manchester, UK