spapr_pci: Advertise MSI quota
authorBadari Pulavarty <pbadari@us.ibm.com>
Wed, 11 Jun 2014 08:49:33 +0000 (18:49 +1000)
committerAlexander Graf <agraf@suse.de>
Mon, 16 Jun 2014 11:24:46 +0000 (13:24 +0200)
Hotplug of multiple disks fails due to MSI vector quota check.
Number of MSI vectors default to 8 allowing only 4 devices.
This happens on RHEL6.5 guest. RHEL7 and SLES11 guests fallback
to INTX.

One way to workaround the issue is to increase total MSIs,
so that MSI quota check allows us to hotplug multiple disks.

This sets the quota to the maximum number of interupts XICS has
which is 1024 now (XICS_IRQS). This moves XICS_IRQS from spapr.c
to xics.h for wider visibility.

Signed-off-by: Badari Pulavarty <pbadari@us.ibm.com>
[aik: put XICS_IRQS=1024 instead of 64i, fixed endianness and size]
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Alexander Graf <agraf@suse.de>
hw/ppc/spapr.c
hw/ppc/spapr_pci.c
include/hw/ppc/xics.h

index fbb4e0da15ef11a0e5f3912f9ee5237737a3da47..e06321cf15bc1ed35584b9b57e6b6356a821070b 100644 (file)
@@ -80,7 +80,6 @@
 #define TIMEBASE_FREQ           512000000ULL
 
 #define MAX_CPUS                256
-#define XICS_IRQS               1024
 
 #define PHANDLE_XICP            0x00001111
 
index 3b01beadbbc833b070fdddda2c1c487a83e14267..988f8cb858a109a1cc90df7a5bb72fc5eece4fb5 100644 (file)
@@ -876,6 +876,7 @@ int spapr_populate_pci_dt(sPAPRPHBState *phb,
     _FDT(fdt_setprop(fdt, bus_off, "ranges", &ranges, sizeof(ranges)));
     _FDT(fdt_setprop(fdt, bus_off, "reg", &bus_reg, sizeof(bus_reg)));
     _FDT(fdt_setprop_cell(fdt, bus_off, "ibm,pci-config-space-type", 0x1));
+    _FDT(fdt_setprop_cell(fdt, bus_off, "ibm,pe-total-#msi", XICS_IRQS));
 
     /* Build the interrupt-map, this must matches what is done
      * in pci_spapr_map_irq
index 0d7673de94e3cf53d738c8633867b48409f76aa8..85e4c8a3dd11c9abd3a3074379b2133790a134fa 100644 (file)
@@ -152,6 +152,8 @@ struct ICSIRQState {
     uint8_t status;
 };
 
+#define XICS_IRQS               1024
+
 qemu_irq xics_get_qirq(XICSState *icp, int irq);
 void xics_set_irq_type(XICSState *icp, int irq, bool lsi);