[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH 27/27] sPAPR: Clear stale MSIx table during EEH reset
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PATCH 27/27] sPAPR: Clear stale MSIx table during EEH reset |
Date: |
Thu, 2 Jul 2015 16:09:38 +1000 |
From: Gavin Shan <address@hidden>
The PCI device MSIx table is cleaned out in hardware after EEH PE
reset. However, we still hold the stale MSIx entries in QEMU, which
should be cleared accordingly. Otherwise, we will run into another
(recursive) EEH error and the PCI devices contained in the PE have
to be offlined exceptionally.
The patch introduces function spapr_phb_vfio_eeh_pre_reset(), which
is called by sPAPR when asserting hot or fundamental reset, to clear
stale MSIx table for VFIO PCI devices before EEH PE reset so that
MSIx table could be restored properly after EEH PE reset.
Signed-off-by: Gavin Shan <address@hidden>
Signed-off-by: David Gibson <address@hidden>
---
hw/ppc/spapr_pci_vfio.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c
index 8104074..cca45ed 100644
--- a/hw/ppc/spapr_pci_vfio.c
+++ b/hw/ppc/spapr_pci_vfio.c
@@ -19,6 +19,7 @@
#include "hw/ppc/spapr.h"
#include "hw/pci-host/spapr.h"
+#include "hw/pci/msix.h"
#include "linux/vfio.h"
#include "hw/vfio/vfio.h"
@@ -159,6 +160,49 @@ static int spapr_phb_vfio_eeh_get_state(sPAPRPHBState
*sphb, int *state)
return RTAS_OUT_SUCCESS;
}
+static void spapr_phb_vfio_eeh_clear_dev_msix(PCIBus *bus,
+ PCIDevice *pdev,
+ void *opaque)
+{
+ /* Check if the device is VFIO PCI device */
+ if (!object_dynamic_cast(OBJECT(pdev), "vfio-pci")) {
+ return;
+ }
+
+ /*
+ * The MSIx table will be cleaned out by reset. We need
+ * disable it so that it can be reenabled properly. Also,
+ * the cached MSIx table should be cleared as it's not
+ * reflecting the contents in hardware.
+ */
+ if (msix_enabled(pdev)) {
+ uint16_t flags;
+
+ flags = pci_host_config_read_common(pdev,
+ pdev->msix_cap + PCI_MSIX_FLAGS,
+ pci_config_size(pdev), 2);
+ flags &= ~PCI_MSIX_FLAGS_ENABLE;
+ pci_host_config_write_common(pdev,
+ pdev->msix_cap + PCI_MSIX_FLAGS,
+ pci_config_size(pdev), flags, 2);
+ }
+
+ msix_reset(pdev);
+}
+
+static void spapr_phb_vfio_eeh_clear_bus_msix(PCIBus *bus, void *opaque)
+{
+ pci_for_each_device(bus, pci_bus_num(bus),
+ spapr_phb_vfio_eeh_clear_dev_msix, NULL);
+}
+
+static void spapr_phb_vfio_eeh_pre_reset(sPAPRPHBState *sphb)
+{
+ PCIHostState *phb = PCI_HOST_BRIDGE(sphb);
+
+ pci_for_each_bus(phb->bus, spapr_phb_vfio_eeh_clear_bus_msix, NULL);
+}
+
static int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option)
{
sPAPRPHBVFIOState *svphb = SPAPR_PCI_VFIO_HOST_BRIDGE(sphb);
@@ -170,9 +214,11 @@ static int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb,
int option)
op.op = VFIO_EEH_PE_RESET_DEACTIVATE;
break;
case RTAS_SLOT_RESET_HOT:
+ spapr_phb_vfio_eeh_pre_reset(sphb);
op.op = VFIO_EEH_PE_RESET_HOT;
break;
case RTAS_SLOT_RESET_FUNDAMENTAL:
+ spapr_phb_vfio_eeh_pre_reset(sphb);
op.op = VFIO_EEH_PE_RESET_FUNDAMENTAL;
break;
default:
--
2.4.3
- [Qemu-ppc] [PATCH 23/27] spapr_vty: lookup should only return valid VTY objects, (continued)
- [Qemu-ppc] [PATCH 23/27] spapr_vty: lookup should only return valid VTY objects, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 24/27] spapr-vty: Use TYPE_ definition instead of hardcoding, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 19/27] xics_kvm: Don't enable KVM_CAP_IRQ_XICS if already enabled, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 22/27] spapr_pci: drop redundant args in spapr_[populate, create]_pci_child_dt, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 17/27] spapr: Consolidate cpu init code into a routine, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 25/27] sPAPR: Don't enable EEH on emulated PCI devices, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 18/27] ppc: Update cpu_model in MachineState, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 21/27] spapr_pci: populate ibm,loc-code, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 14/27] spapr: Support ibm, lrdr-capacity device tree property, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 20/27] spapr_pci: enumerate and add PCI device tree, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 27/27] sPAPR: Clear stale MSIx table during EEH reset,
David Gibson <=
- [Qemu-ppc] [PATCH 16/27] spapr: Reorganize CPU dt generation code, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 26/27] sPAPR: Reenable EEH functionality on reboot, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 03/27] spapr: Merge sPAPREnvironment into sPAPRMachineState, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 02/27] pseries: Update SLOF firmware image to qemu-slof-20150429, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 00/27] sPAPR updates 2015-07-02, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 01/27] spapr: ensure we have at least one XICS server, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 07/27] spapr_pci: encode missing 64-bit memory address space, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 04/27] spapr: Remove obsolete ram_limit field from sPAPRMachineState, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 06/27] spapr: Add sPAPRMachineClass, David Gibson, 2015/07/02
- [Qemu-ppc] [PATCH 09/27] spapr_pci: set device node unit address as hex, David Gibson, 2015/07/02