On Sun, 2011-10-02 at 22:17 -0500, Jon Mason wrote: > On Sun, Oct 2, 2011 at 12:32 AM, Benjamin Herrenschmidt > <benh@xxxxxxxxxxxxxxxxxxx> wrote: > > 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 ? > > I don't believe there is an existing pcie boot arg parameter logic, > and it seems overkill to add one just for this. > > If you don't have any other issues with this, I'd like to send this > and the backlog to Linus. Ok. > Thanks, > Jon > > > > > 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 > > -- 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