Blame SOURCES/0006-pci-reserve-resources-for-pcie-pci-bridge-to-fix-reg.patch

9fd1b6
From 4a31485efad9db7feed56f483e123f0b58c38b2f Mon Sep 17 00:00:00 2001
9fd1b6
From: Igor Mammedov <imammedo@redhat.com>
9fd1b6
Date: Mon, 29 Nov 2021 06:48:11 -0500
9fd1b6
Subject: pci: reserve resources for pcie-pci-bridge to fix regressed hotplug
9fd1b6
 on q35
9fd1b6
9fd1b6
RH-Bugzilla: 2001921
9fd1b6
9fd1b6
If QEMU is started with unpopulated pcie-pci-bridge with ACPI PCI
9fd1b6
hotplug enabled (default since QEMU-6.1), hotplugging a PCI device
9fd1b6
into one of the bridge slots fails due to lack of resources.
9fd1b6
9fd1b6
once linux guest is booted (test used Fedora 34), hotplug NIC from
9fd1b6
QEMU monitor:
9fd1b6
  (qemu) device_add rtl8139,bus=pcie-pci-bridge-0,addr=0x2
9fd1b6
9fd1b6
guest fails hotplug with:
9fd1b6
  pci 0000:01:02.0: [10ec:8139] type 00 class 0x020000
9fd1b6
  pci 0000:01:02.0: reg 0x10: [io  0x0000-0x00ff]
9fd1b6
  pci 0000:01:02.0: reg 0x14: [mem 0x00000000-0x000000ff]
9fd1b6
  pci 0000:01:02.0: reg 0x30: [mem 0x00000000-0x0003ffff pref]
9fd1b6
  pci 0000:01:02.0: BAR 6: no space for [mem size 0x00040000 pref]
9fd1b6
  pci 0000:01:02.0: BAR 6: failed to assign [mem size 0x00040000 pref]
9fd1b6
  pci 0000:01:02.0: BAR 0: no space for [io  size 0x0100]
9fd1b6
  pci 0000:01:02.0: BAR 0: failed to assign [io  size 0x0100]
9fd1b6
  pci 0000:01:02.0: BAR 1: no space for [mem size 0x00000100]
9fd1b6
  pci 0000:01:02.0: BAR 1: failed to assign [mem size 0x00000100]
9fd1b6
  8139cp: 8139cp: 10/100 PCI Ethernet driver v1.3 (Mar 22, 2004)
9fd1b6
  PCI Interrupt Link [GSIG] enabled at IRQ 22
9fd1b6
  8139cp 0000:01:02.0: no MMIO resource
9fd1b6
  8139cp: probe of 0000:01:02.0 failed with error -5
9fd1b6
9fd1b6
Reason for this is that commit [1] didn't take into account
9fd1b6
pcie-pci-bridge, marking bridge as non hotpluggable instead of
9fd1b6
handling it as possibly SHPC capable bridge.
9fd1b6
Fix issue by checking if pcie-pci-bridge is SHPC capable and
9fd1b6
if it is mark it as hotpluggable.
9fd1b6
9fd1b6
Fixes regression in QEMU-6.1 and later, since it was switched
9fd1b6
to ACPI based PCI hotplug on Q35 by default at that time.
9fd1b6
9fd1b6
[1]
9fd1b6
Fixes: 3aa31d7d637 ("hw/pci: reserve IO and mem for pci express downstream ports with no devices attached")
9fd1b6
Signed-off-by: Igor Mammedov imammedo@redhat.com
9fd1b6
CC: mapfelba@redhat.com
9fd1b6
CC: kraxel@redhat.com
9fd1b6
CC: mst@redhat.com
9fd1b6
CC: lvivier@redhat.com
9fd1b6
CC: jusual@redhat.com
9fd1b6
Tested-by: Laurent Vivier <lvivier@redhat.com>
9fd1b6
Acked-by: Michael S. Tsirkin <mst@redhat.com>
9fd1b6
Message-Id: <20211129114812.231849-2-imammedo@redhat.com>
9fd1b6
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
9fd1b6
---
9fd1b6
 src/fw/pciinit.c | 5 +++++
9fd1b6
 1 file changed, 5 insertions(+)
9fd1b6
9fd1b6
diff --git a/src/fw/pciinit.c b/src/fw/pciinit.c
9fd1b6
index 3c99d51..badf13d 100644
9fd1b6
--- a/src/fw/pciinit.c
9fd1b6
+++ b/src/fw/pciinit.c
9fd1b6
@@ -808,6 +808,10 @@ static hotplug_type_t pci_bus_hotplug_support(struct pci_bus *bus, u8 pcie_cap)
9fd1b6
                                           pcie_cap + PCI_EXP_FLAGS);
9fd1b6
         u8 port_type = ((pcie_flags & PCI_EXP_FLAGS_TYPE) >>
9fd1b6
                        (__builtin_ffs(PCI_EXP_FLAGS_TYPE) - 1));
9fd1b6
+
9fd1b6
+        if (port_type == PCI_EXP_TYPE_PCI_BRIDGE)
9fd1b6
+            goto check_shpc;
9fd1b6
+
9fd1b6
         u8 downstream_port = (port_type == PCI_EXP_TYPE_DOWNSTREAM) ||
9fd1b6
                              (port_type == PCI_EXP_TYPE_ROOT_PORT);
9fd1b6
         /*
9fd1b6
@@ -825,6 +829,7 @@ static hotplug_type_t pci_bus_hotplug_support(struct pci_bus *bus, u8 pcie_cap)
9fd1b6
             HOTPLUG_PCIE : HOTPLUG_NO_SUPPORTED;
9fd1b6
     }
9fd1b6
 
9fd1b6
+check_shpc:
9fd1b6
     shpc_cap = pci_find_capability(bus->bus_dev->bdf, PCI_CAP_ID_SHPC, 0);
9fd1b6
     return !!shpc_cap ? HOTPLUG_SHPC : HOTPLUG_NO_SUPPORTED;
9fd1b6
 }
9fd1b6
-- 
9fd1b6
2.27.0
9fd1b6