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

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

 



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


[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