On Sat, 2011-10-01 at 12:36 -0500, Jon Mason wrote: > Add the ability to disable PCI-E MPS turning and using the BIOS > configured MPS defaults. Due to the number of issues recently > discovered on some x86 chipsets, make this the default behavior. > > Also, add the option for peer to peer DMA MPS configuration. Peer to > peer DMA is outside the scope of this patch, but MPS configuration could > prevent it from working by having the MPS on one root port different > than the MPS on another. To work around this, simply make the system > wide MPS the smallest possible value (128B). Should this be instead pcie=xxx ? Cheers, Ben. > Signed-off-by: Jon Mason <mason@xxxxxxxx> > --- > drivers/pci/pci.c | 6 +++++- > drivers/pci/probe.c | 14 +++++++++++++- > 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 d369316..5db5986 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; > unsigned long pci_hotplug_io_size = DEFAULT_HOTPLUG_IO_SIZE; > unsigned long pci_hotplug_mem_size = DEFAULT_HOTPLUG_MEM_SIZE; > > -enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_SAFE; > +enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_TUNE_OFF; > > /* > * The default CLS is used if arch didn't set CLS explicitly and not > @@ -3582,10 +3582,14 @@ static int __init pci_setup(char *str) > pci_hotplug_io_size = memparse(str + 9, &str); > } else if (!strncmp(str, "hpmemsize=", 10)) { > pci_hotplug_mem_size = memparse(str + 10, &str); > + } else if (!strncmp(str, "pcie_bus_tune_off", 17)) { > + pcie_bus_config = PCIE_BUS_TUNE_OFF; > } else if (!strncmp(str, "pcie_bus_safe", 13)) { > pcie_bus_config = PCIE_BUS_SAFE; > } else if (!strncmp(str, "pcie_bus_perf", 13)) { > pcie_bus_config = PCIE_BUS_PERFORMANCE; > + } else if (!strncmp(str, "pcie_bus_peer2peer", 18)) { > + pcie_bus_config = PCIE_BUS_PEER2PEER; > } else { > printk(KERN_ERR "PCI: Unknown option `%s'\n", > str); > diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c > index a919db2..4829424 100644 > --- a/drivers/pci/probe.c > +++ b/drivers/pci/probe.c > @@ -1451,12 +1451,24 @@ static int pcie_bus_configure_set(struct pci_dev *dev, void *data) > */ > void pcie_bus_configure_settings(struct pci_bus *bus, u8 mpss) > { > - u8 smpss = mpss; > + u8 smpss; > > if (!pci_is_pcie(bus->self)) > return; > > + if (pcie_bus_config == PCIE_BUS_TUNE_OFF) > + return; > + > + /* FIXME - Peer to peer DMA is possible, though the endpoint would need > + * to be aware to the MPS of the destination. To work around this, > + * simply force the MPS of the entire system to the smallest possible. > + */ > + if (pcie_bus_config == PCIE_BUS_PEER2PEER) > + smpss = 0; > + > if (pcie_bus_config == PCIE_BUS_SAFE) { > + smpss = mpss; > + > pcie_find_smpss(bus->self, &smpss); > pci_walk_bus(bus, pcie_find_smpss, &smpss); > } > diff --git a/include/linux/pci.h b/include/linux/pci.h > index 8c230cb..9fc0122 100644 > --- a/include/linux/pci.h > +++ b/include/linux/pci.h > @@ -621,8 +621,9 @@ struct pci_driver { > extern void pcie_bus_configure_settings(struct pci_bus *bus, u8 smpss); > > enum pcie_bus_config_types { > - PCIE_BUS_PERFORMANCE, > + PCIE_BUS_TUNE_OFF, > PCIE_BUS_SAFE, > + PCIE_BUS_PERFORMANCE, > PCIE_BUS_PEER2PEER, > }; > -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html