Commit 0cbaa57d828aa0a067e06d3c6d795b12ae9fb776

Authored by Bjorn Helgaas

Merge branch 'topic/stratus' into next

Showing 5 changed files Side-by-side Diff

Documentation/kernel-parameters.txt
... ... @@ -2161,6 +2161,9 @@
2161 2161 on: Turn realloc on
2162 2162 realloc same as realloc=on
2163 2163 noari do not use PCIe ARI.
  2164 + pcie_scan_all Scan all possible PCIe devices. Otherwise we
  2165 + only look for one device below a PCIe downstream
  2166 + port.
2164 2167  
2165 2168 pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power
2166 2169 Management.
arch/x86/pci/common.c
... ... @@ -11,6 +11,7 @@
11 11 #include <linux/dmi.h>
12 12 #include <linux/slab.h>
13 13  
  14 +#include <asm-generic/pci-bridge.h>
14 15 #include <asm/acpi.h>
15 16 #include <asm/segment.h>
16 17 #include <asm/io.h>
... ... @@ -229,6 +230,14 @@
229 230 }
230 231 #endif
231 232  
  233 +static int __devinit set_scan_all(const struct dmi_system_id *d)
  234 +{
  235 + printk(KERN_INFO "PCI: %s detected, enabling pci=pcie_scan_all\n",
  236 + d->ident);
  237 + pci_add_flags(PCI_SCAN_ALL_PCIE_DEVS);
  238 + return 0;
  239 +}
  240 +
232 241 static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
233 242 #ifdef __i386__
234 243 /*
... ... @@ -418,6 +427,13 @@
418 427 .matches = {
419 428 DMI_MATCH(DMI_SYS_VENDOR, "HP"),
420 429 DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL585 G2"),
  430 + },
  431 + },
  432 + {
  433 + .callback = set_scan_all,
  434 + .ident = "Stratus/NEC ftServer",
  435 + .matches = {
  436 + DMI_MATCH(DMI_SYS_VENDOR, "ftServer"),
421 437 },
422 438 },
423 439 {}
... ... @@ -22,6 +22,7 @@
22 22 #include <linux/interrupt.h>
23 23 #include <linux/device.h>
24 24 #include <linux/pm_runtime.h>
  25 +#include <asm-generic/pci-bridge.h>
25 26 #include <asm/setup.h>
26 27 #include "pci.h"
27 28  
... ... @@ -3900,6 +3901,8 @@
3900 3901 pcie_bus_config = PCIE_BUS_PERFORMANCE;
3901 3902 } else if (!strncmp(str, "pcie_bus_peer2peer", 18)) {
3902 3903 pcie_bus_config = PCIE_BUS_PEER2PEER;
  3904 + } else if (!strncmp(str, "pcie_scan_all", 13)) {
  3905 + pci_add_flags(PCI_SCAN_ALL_PCIE_DEVS);
3903 3906 } else {
3904 3907 printk(KERN_ERR "PCI: Unknown option `%s'\n",
3905 3908 str);
... ... @@ -10,6 +10,7 @@
10 10 #include <linux/module.h>
11 11 #include <linux/cpumask.h>
12 12 #include <linux/pci-aspm.h>
  13 +#include <asm-generic/pci-bridge.h>
13 14 #include "pci.h"
14 15  
15 16 #define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */
16 17  
... ... @@ -1336,10 +1337,13 @@
1336 1337 static int only_one_child(struct pci_bus *bus)
1337 1338 {
1338 1339 struct pci_dev *parent = bus->self;
  1340 +
1339 1341 if (!parent || !pci_is_pcie(parent))
1340 1342 return 0;
1341   - if (parent->pcie_type == PCI_EXP_TYPE_ROOT_PORT ||
1342   - parent->pcie_type == PCI_EXP_TYPE_DOWNSTREAM)
  1343 + if (parent->pcie_type == PCI_EXP_TYPE_ROOT_PORT)
  1344 + return 1;
  1345 + if (parent->pcie_type == PCI_EXP_TYPE_DOWNSTREAM &&
  1346 + !pci_has_flag(PCI_SCAN_ALL_PCIE_DEVS))
1343 1347 return 1;
1344 1348 return 0;
1345 1349 }
include/asm-generic/pci-bridge.h
... ... @@ -30,6 +30,12 @@
30 30 PCI_ENABLE_PROC_DOMAINS = 0x00000010,
31 31 /* ... except for domain 0 */
32 32 PCI_COMPAT_DOMAIN_0 = 0x00000020,
  33 +
  34 + /* PCIe downstream ports are bridges that normally lead to only a
  35 + * device 0, but if this is set, we scan all possible devices, not
  36 + * just device 0.
  37 + */
  38 + PCI_SCAN_ALL_PCIE_DEVS = 0x00000040,
33 39 };
34 40  
35 41 #ifdef CONFIG_PCI