on: Turn realloc on
                realloc         same as realloc=on
                noari           do not use PCIe ARI.
+               pcie_scan_all   Scan all possible PCIe devices.  Otherwise we
+                               only look for one device below a PCIe downstream
+                               port.
 
        pcie_aspm=      [PCIE] Forcibly enable or disable PCIe Active State Power
                        Management.
 
 #include <linux/dmi.h>
 #include <linux/slab.h>
 
+#include <asm-generic/pci-bridge.h>
 #include <asm/acpi.h>
 #include <asm/segment.h>
 #include <asm/io.h>
 }
 #endif
 
+static int __devinit set_scan_all(const struct dmi_system_id *d)
+{
+       printk(KERN_INFO "PCI: %s detected, enabling pci=pcie_scan_all\n",
+              d->ident);
+       pci_add_flags(PCI_SCAN_ALL_PCIE_DEVS);
+       return 0;
+}
+
 static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
 #ifdef __i386__
 /*
                        DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL585 G2"),
                },
        },
+       {
+               .callback = set_scan_all,
+               .ident = "Stratus/NEC ftServer",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "ftServer"),
+               },
+       },
        {}
 };
 
 
 #include <linux/interrupt.h>
 #include <linux/device.h>
 #include <linux/pm_runtime.h>
+#include <asm-generic/pci-bridge.h>
 #include <asm/setup.h>
 #include "pci.h"
 
                                pcie_bus_config = PCIE_BUS_PERFORMANCE;
                        } else if (!strncmp(str, "pcie_bus_peer2peer", 18)) {
                                pcie_bus_config = PCIE_BUS_PEER2PEER;
+                       } else if (!strncmp(str, "pcie_scan_all", 13)) {
+                               pci_add_flags(PCI_SCAN_ALL_PCIE_DEVS);
                        } else {
                                printk(KERN_ERR "PCI: Unknown option `%s'\n",
                                                str);
 
 #include <linux/module.h>
 #include <linux/cpumask.h>
 #include <linux/pci-aspm.h>
+#include <asm-generic/pci-bridge.h>
 #include "pci.h"
 
 #define CARDBUS_LATENCY_TIMER  176     /* secondary latency timer */
 static int only_one_child(struct pci_bus *bus)
 {
        struct pci_dev *parent = bus->self;
+
        if (!parent || !pci_is_pcie(parent))
                return 0;
-       if (parent->pcie_type == PCI_EXP_TYPE_ROOT_PORT ||
-           parent->pcie_type == PCI_EXP_TYPE_DOWNSTREAM)
+       if (parent->pcie_type == PCI_EXP_TYPE_ROOT_PORT)
+               return 1;
+       if (parent->pcie_type == PCI_EXP_TYPE_DOWNSTREAM &&
+           !pci_has_flag(PCI_SCAN_ALL_PCIE_DEVS))
                return 1;
        return 0;
 }
 
        PCI_ENABLE_PROC_DOMAINS = 0x00000010,
        /* ... except for domain 0 */
        PCI_COMPAT_DOMAIN_0     = 0x00000020,
+
+       /* PCIe downstream ports are bridges that normally lead to only a
+        * device 0, but if this is set, we scan all possible devices, not
+        * just device 0.
+        */
+       PCI_SCAN_ALL_PCIE_DEVS  = 0x00000040,
 };
 
 #ifdef CONFIG_PCI