Re: [PATCH] PCI: Disable MPS configuration by default

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux