76daa3
From b131cb258ae051a74bfa4566b62322fea5268c93 Mon Sep 17 00:00:00 2001
76daa3
From: Marcel Apfelbaum <marcel@redhat.com>
76daa3
Date: Sun, 18 Jun 2017 14:41:05 +0200
76daa3
Subject: [PATCH 8/8] hw/pcie: fix the generic pcie root port to support
76daa3
 migration
76daa3
76daa3
RH-Author: Marcel Apfelbaum <marcel@redhat.com>
76daa3
Message-id: <20170618144105.52277-1-marcel@redhat.com>
76daa3
Patchwork-id: 75639
76daa3
O-Subject: [RHEL-7.4 qemu-kvm-rhev PATCH] hw/pcie: fix the generic pcie root port to support migration
76daa3
Bugzilla: 1455150
76daa3
RH-Acked-by: Michael S. Tsirkin <mst@redhat.com>
76daa3
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
76daa3
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
76daa3
RH-Acked-by: Auger Eric <eric.auger@redhat.com>
76daa3
76daa3
Upstream: merged
76daa3
Tests: migration + hot-unplug on private laptop
76daa3
76daa3
Add msix state to pcie-root-ports's vmstate
76daa3
in order to support migration.
76daa3
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
76daa3
Conflicts:
76daa3
	include/hw/compat.h
76daa3
        - no need for 2.9 "x-migrate-msix" compat prop.
76daa3
76daa3
Signed-off-by: Marcel Apfelbaum <marcel@redhat.com>
76daa3
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
76daa3
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
76daa3
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
76daa3
(cherry picked from commit bc277a52fbea1532d1adf30ba0edf15ab3dcdead)
76daa3
Signed-off-by: Marcel Apfelbaum <marcel@redhat.com>
76daa3
---
76daa3
 hw/pci-bridge/gen_pcie_root_port.c | 25 +++++++++++++++++++++++++
76daa3
 1 file changed, 25 insertions(+)
76daa3
76daa3
diff --git a/hw/pci-bridge/gen_pcie_root_port.c b/hw/pci-bridge/gen_pcie_root_port.c
76daa3
index 8ebffa8..cb694d6 100644
76daa3
--- a/hw/pci-bridge/gen_pcie_root_port.c
76daa3
+++ b/hw/pci-bridge/gen_pcie_root_port.c
76daa3
@@ -20,6 +20,14 @@
76daa3
 #define GEN_PCIE_ROOT_PORT_AER_OFFSET           0x100
76daa3
 #define GEN_PCIE_ROOT_PORT_MSIX_NR_VECTOR       1
76daa3
 
76daa3
+typedef struct GenPCIERootPort {
76daa3
+    /*< private >*/
76daa3
+    PCIESlot parent_obj;
76daa3
+    /*< public >*/
76daa3
+
76daa3
+    bool migrate_msix;
76daa3
+} GenPCIERootPort;
76daa3
+
76daa3
 static uint8_t gen_rp_aer_vector(const PCIDevice *d)
76daa3
 {
76daa3
     return 0;
76daa3
@@ -45,6 +53,13 @@ static void gen_rp_interrupts_uninit(PCIDevice *d)
76daa3
     msix_uninit_exclusive_bar(d);
76daa3
 }
76daa3
 
76daa3
+static bool gen_rp_test_migrate_msix(void *opaque, int version_id)
76daa3
+{
76daa3
+    GenPCIERootPort *rp = opaque;
76daa3
+
76daa3
+    return rp->migrate_msix;
76daa3
+}
76daa3
+
76daa3
 static const VMStateDescription vmstate_rp_dev = {
76daa3
     .name = "pcie-root-port",
76daa3
     .version_id = 1,
76daa3
@@ -54,10 +69,18 @@ static const VMStateDescription vmstate_rp_dev = {
76daa3
         VMSTATE_PCI_DEVICE(parent_obj.parent_obj.parent_obj, PCIESlot),
76daa3
         VMSTATE_STRUCT(parent_obj.parent_obj.parent_obj.exp.aer_log,
76daa3
                        PCIESlot, 0, vmstate_pcie_aer_log, PCIEAERLog),
76daa3
+        VMSTATE_MSIX_TEST(parent_obj.parent_obj.parent_obj.parent_obj,
76daa3
+                          GenPCIERootPort,
76daa3
+                          gen_rp_test_migrate_msix),
76daa3
         VMSTATE_END_OF_LIST()
76daa3
     }
76daa3
 };
76daa3
 
76daa3
+static Property gen_rp_props[] = {
76daa3
+    DEFINE_PROP_BOOL("x-migrate-msix", GenPCIERootPort, migrate_msix, true),
76daa3
+    DEFINE_PROP_END_OF_LIST()
76daa3
+};
76daa3
+
76daa3
 static void gen_rp_dev_class_init(ObjectClass *klass, void *data)
76daa3
 {
76daa3
     DeviceClass *dc = DEVICE_CLASS(klass);
76daa3
@@ -68,6 +91,7 @@ static void gen_rp_dev_class_init(ObjectClass *klass, void *data)
76daa3
     k->device_id = PCI_DEVICE_ID_REDHAT_PCIE_RP;
76daa3
     dc->desc = "PCI Express Root Port";
76daa3
     dc->vmsd = &vmstate_rp_dev;
76daa3
+    dc->props = gen_rp_props;
76daa3
     rpc->aer_vector = gen_rp_aer_vector;
76daa3
     rpc->interrupts_init = gen_rp_interrupts_init;
76daa3
     rpc->interrupts_uninit = gen_rp_interrupts_uninit;
76daa3
@@ -77,6 +101,7 @@ static void gen_rp_dev_class_init(ObjectClass *klass, void *data)
76daa3
 static const TypeInfo gen_rp_dev_info = {
76daa3
     .name          = TYPE_GEN_PCIE_ROOT_PORT,
76daa3
     .parent        = TYPE_PCIE_ROOT_PORT,
76daa3
+    .instance_size = sizeof(GenPCIERootPort),
76daa3
     .class_init    = gen_rp_dev_class_init,
76daa3
 };
76daa3
 
76daa3
-- 
76daa3
1.8.3.1
76daa3