From d96c2d51b6575daa10386e39eefbac811a67b809 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Jul 09 2014 15:26:49 +0000 Subject: Fix PCI-e hotplug (bz #1115598) --- diff --git a/0001-hw-pci-reserve-IO-and-mem-for-pci-express-downstream.patch b/0001-hw-pci-reserve-IO-and-mem-for-pci-express-downstream.patch new file mode 100644 index 0000000..6e169cc --- /dev/null +++ b/0001-hw-pci-reserve-IO-and-mem-for-pci-express-downstream.patch @@ -0,0 +1,81 @@ +From 3aa31d7d6375303fc88438021aad485f50bb1e39 Mon Sep 17 00:00:00 2001 +Message-Id: <3aa31d7d6375303fc88438021aad485f50bb1e39.1404919343.git.crobinso@redhat.com> +From: Marcel Apfelbaum +Date: Mon, 23 Jun 2014 18:29:51 +0300 +Subject: [PATCH] hw/pci: reserve IO and mem for pci express downstream ports + with no devices attached + +Commit c6e298e1f12e0f4ca02b6da5e42919ae055f6830 + hw/pci: reserve IO and mem for pci-2-pci bridges with no devices attached + +introduced support for hot-plugging devices behind pci-2-pci bridges. +Extend hotplug support also for pci express downstream ports. + +Signed-off-by: Marcel Apfelbaum +Signed-off-by: Gerd Hoffmann +--- + src/fw/pciinit.c | 34 ++++++++++++++++++++++++++++++++-- + 1 file changed, 32 insertions(+), 2 deletions(-) + +diff --git a/src/fw/pciinit.c b/src/fw/pciinit.c +index 0ad548f..fd5dfb9 100644 +--- a/src/fw/pciinit.c ++++ b/src/fw/pciinit.c +@@ -636,6 +636,36 @@ pci_region_create_entry(struct pci_bus *bus, struct pci_device *dev, + return entry; + } + ++static int pci_bus_hotplug_support(struct pci_bus *bus) ++{ ++ u8 pcie_cap = pci_find_capability(bus->bus_dev, PCI_CAP_ID_EXP); ++ u8 shpc_cap; ++ ++ if (pcie_cap) { ++ u16 pcie_flags = pci_config_readw(bus->bus_dev->bdf, ++ pcie_cap + PCI_EXP_FLAGS); ++ u8 port_type = ((pcie_flags & PCI_EXP_FLAGS_TYPE) >> ++ (__builtin_ffs(PCI_EXP_FLAGS_TYPE) - 1)); ++ u8 downstream_port = (port_type == PCI_EXP_TYPE_DOWNSTREAM) || ++ (port_type == PCI_EXP_TYPE_ROOT_PORT); ++ /* ++ * PCI Express SPEC, 7.8.2: ++ * Slot Implemented – When Set, this bit indicates that the Link ++ * HwInit associated with this Port is connected to a slot (as ++ * compared to being connected to a system-integrated device or ++ * being disabled). ++ * This bit is valid for Downstream Ports. This bit is undefined ++ * for Upstream Ports. ++ */ ++ u16 slot_implemented = pcie_flags & PCI_EXP_FLAGS_SLOT; ++ ++ return downstream_port && slot_implemented; ++ } ++ ++ shpc_cap = pci_find_capability(bus->bus_dev, PCI_CAP_ID_SHPC); ++ return !!shpc_cap; ++} ++ + static int pci_bios_check_devices(struct pci_bus *busses) + { + dprintf(1, "PCI: check devices\n"); +@@ -678,7 +708,7 @@ static int pci_bios_check_devices(struct pci_bus *busses) + continue; + struct pci_bus *parent = &busses[pci_bdf_to_bus(s->bus_dev->bdf)]; + int type; +- u8 shpc_cap = pci_find_capability(s->bus_dev, PCI_CAP_ID_SHPC); ++ int hotplug_support = pci_bus_hotplug_support(s); + for (type = 0; type < PCI_REGION_TYPE_COUNT; type++) { + u64 align = (type == PCI_REGION_TYPE_IO) ? + PCI_BRIDGE_IO_MIN : PCI_BRIDGE_MEM_MIN; +@@ -687,7 +717,7 @@ static int pci_bios_check_devices(struct pci_bus *busses) + if (pci_region_align(&s->r[type]) > align) + align = pci_region_align(&s->r[type]); + u64 sum = pci_region_sum(&s->r[type]); +- if (!sum && shpc_cap) ++ if (!sum && hotplug_support) + sum = align; /* reserve min size for hot-plug */ + u64 size = ALIGN(sum, align); + int is64 = pci_bios_bridge_region_is64(&s->r[type], +-- +1.9.3 + diff --git a/seabios.spec b/seabios.spec index 391517f..ba0b6b8 100644 --- a/seabios.spec +++ b/seabios.spec @@ -1,6 +1,6 @@ Name: seabios Version: 1.7.5 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Open-source legacy BIOS implementation Group: Applications/Emulators @@ -19,6 +19,9 @@ Source16: config.coreboot Source17: config.seabios-128k Source18: config.seabios-256k +# Fix PCI-e hotplug (bz #1115598) +Patch0001: 0001-hw-pci-reserve-IO-and-mem-for-pci-express-downstream.patch + BuildRequires: python iasl BuildRequires: binutils-x86_64-linux-gnu gcc-x86_64-linux-gnu @@ -71,6 +74,9 @@ SeaVGABIOS is an open-source VGABIOS implementation. %prep %setup -q +# Fix PCI-e hotplug (bz #1115598) +%patch0001 -p1 + # Makefile changes version to include date and buildhost sed -i 's,VERSION=%{version}.*,VERSION=%{version},g' Makefile @@ -137,6 +143,9 @@ install -m 0644 binaries/vgabios*.bin $RPM_BUILD_ROOT%{_datadir}/seavgabios %changelog +* Wed Jul 09 2014 Cole Robinson - 1.7.5-3 +- Fix PCI-e hotplug (bz #1115598) + * Sun Jun 08 2014 Fedora Release Engineering - 1.7.5-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild