diff options
| -rw-r--r-- | drivers/pci/pci.c | 6 | ||||
| -rw-r--r-- | drivers/pci/probe.c | 14 | ||||
| -rw-r--r-- | include/linux/pci.h | 3 |
3 files changed, 20 insertions, 3 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 4e84fd4a4312..e9651f0a8817 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -77,7 +77,7 @@ unsigned long pci_cardbus_mem_size = DEFAULT_CARDBUS_MEM_SIZE; | |||
| 77 | unsigned long pci_hotplug_io_size = DEFAULT_HOTPLUG_IO_SIZE; | 77 | unsigned long pci_hotplug_io_size = DEFAULT_HOTPLUG_IO_SIZE; |
| 78 | unsigned long pci_hotplug_mem_size = DEFAULT_HOTPLUG_MEM_SIZE; | 78 | unsigned long pci_hotplug_mem_size = DEFAULT_HOTPLUG_MEM_SIZE; |
| 79 | 79 | ||
| 80 | enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_SAFE; | 80 | enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_TUNE_OFF; |
| 81 | 81 | ||
| 82 | /* | 82 | /* |
| 83 | * The default CLS is used if arch didn't set CLS explicitly and not | 83 | * The default CLS is used if arch didn't set CLS explicitly and not |
| @@ -3568,10 +3568,14 @@ static int __init pci_setup(char *str) | |||
| 3568 | pci_hotplug_io_size = memparse(str + 9, &str); | 3568 | pci_hotplug_io_size = memparse(str + 9, &str); |
| 3569 | } else if (!strncmp(str, "hpmemsize=", 10)) { | 3569 | } else if (!strncmp(str, "hpmemsize=", 10)) { |
| 3570 | pci_hotplug_mem_size = memparse(str + 10, &str); | 3570 | pci_hotplug_mem_size = memparse(str + 10, &str); |
| 3571 | } else if (!strncmp(str, "pcie_bus_tune_off", 17)) { | ||
| 3572 | pcie_bus_config = PCIE_BUS_TUNE_OFF; | ||
| 3571 | } else if (!strncmp(str, "pcie_bus_safe", 13)) { | 3573 | } else if (!strncmp(str, "pcie_bus_safe", 13)) { |
| 3572 | pcie_bus_config = PCIE_BUS_SAFE; | 3574 | pcie_bus_config = PCIE_BUS_SAFE; |
| 3573 | } else if (!strncmp(str, "pcie_bus_perf", 13)) { | 3575 | } else if (!strncmp(str, "pcie_bus_perf", 13)) { |
| 3574 | pcie_bus_config = PCIE_BUS_PERFORMANCE; | 3576 | pcie_bus_config = PCIE_BUS_PERFORMANCE; |
| 3577 | } else if (!strncmp(str, "pcie_bus_peer2peer", 18)) { | ||
| 3578 | pcie_bus_config = PCIE_BUS_PEER2PEER; | ||
| 3575 | } else { | 3579 | } else { |
| 3576 | printk(KERN_ERR "PCI: Unknown option `%s'\n", | 3580 | printk(KERN_ERR "PCI: Unknown option `%s'\n", |
| 3577 | str); | 3581 | str); |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index f3f94a5c068f..6ab6bd3df4b2 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
| @@ -1458,12 +1458,24 @@ static int pcie_bus_configure_set(struct pci_dev *dev, void *data) | |||
| 1458 | */ | 1458 | */ |
| 1459 | void pcie_bus_configure_settings(struct pci_bus *bus, u8 mpss) | 1459 | void pcie_bus_configure_settings(struct pci_bus *bus, u8 mpss) |
| 1460 | { | 1460 | { |
| 1461 | u8 smpss = mpss; | 1461 | u8 smpss; |
| 1462 | 1462 | ||
| 1463 | if (!pci_is_pcie(bus->self)) | 1463 | if (!pci_is_pcie(bus->self)) |
| 1464 | return; | 1464 | return; |
| 1465 | 1465 | ||
| 1466 | if (pcie_bus_config == PCIE_BUS_TUNE_OFF) | ||
| 1467 | return; | ||
| 1468 | |||
| 1469 | /* FIXME - Peer to peer DMA is possible, though the endpoint would need | ||
| 1470 | * to be aware to the MPS of the destination. To work around this, | ||
| 1471 | * simply force the MPS of the entire system to the smallest possible. | ||
| 1472 | */ | ||
| 1473 | if (pcie_bus_config == PCIE_BUS_PEER2PEER) | ||
| 1474 | smpss = 0; | ||
| 1475 | |||
| 1466 | if (pcie_bus_config == PCIE_BUS_SAFE) { | 1476 | if (pcie_bus_config == PCIE_BUS_SAFE) { |
| 1477 | smpss = mpss; | ||
| 1478 | |||
| 1467 | pcie_find_smpss(bus->self, &smpss); | 1479 | pcie_find_smpss(bus->self, &smpss); |
| 1468 | pci_walk_bus(bus, pcie_find_smpss, &smpss); | 1480 | pci_walk_bus(bus, pcie_find_smpss, &smpss); |
| 1469 | } | 1481 | } |
diff --git a/include/linux/pci.h b/include/linux/pci.h index 8c230cbcbb48..9fc01226055b 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
| @@ -621,8 +621,9 @@ struct pci_driver { | |||
| 621 | extern void pcie_bus_configure_settings(struct pci_bus *bus, u8 smpss); | 621 | extern void pcie_bus_configure_settings(struct pci_bus *bus, u8 smpss); |
| 622 | 622 | ||
| 623 | enum pcie_bus_config_types { | 623 | enum pcie_bus_config_types { |
| 624 | PCIE_BUS_PERFORMANCE, | 624 | PCIE_BUS_TUNE_OFF, |
| 625 | PCIE_BUS_SAFE, | 625 | PCIE_BUS_SAFE, |
| 626 | PCIE_BUS_PERFORMANCE, | ||
| 626 | PCIE_BUS_PEER2PEER, | 627 | PCIE_BUS_PEER2PEER, |
| 627 | }; | 628 | }; |
| 628 | 629 | ||
