diff mbox

[v1] ARM: pci: add call to pcie_bus_configure_settings()

Message ID 1401297293-3950-1-git-send-email-m-karicheri2@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Murali Karicheri May 28, 2014, 5:14 p.m. UTC
Call pcie_bus_configure_settings on ARM, like for other platforms.
pcie_bus_configure_settings makes sure the MPS across the bus is
uniform and provides the ability to tune the MRSS and MPS to higher
performance values. This is particularly important for embedded where
there is no firmware to program these PCI-E settings for the OS.

Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>

CC: Russell King <linux@arm.linux.org.uk>
CC: Bjorn Helgaas <bhelgaas@google.com>
CC: Arnd Bergmann <arnd@arndb.de>
CC: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
CC: Santosh Shilimkar <santosh.shilimkar@ti.com>
---
 - Fixed comments against initial version
 arch/arm/kernel/bios32.c |   12 ++++++++++++
 1 file changed, 12 insertions(+)

Comments

Bjorn Helgaas May 30, 2014, 3:44 p.m. UTC | #1
On Wed, May 28, 2014 at 01:14:53PM -0400, Murali Karicheri wrote:
> Call pcie_bus_configure_settings on ARM, like for other platforms.
> pcie_bus_configure_settings makes sure the MPS across the bus is
> uniform and provides the ability to tune the MRSS and MPS to higher
> performance values. This is particularly important for embedded where
> there is no firmware to program these PCI-E settings for the OS.
> 
> Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>

I applied this to pci/misc for v3.16.  Russell, let me know if you object
or prefer another route, and I can drop it.  I tweaked the changelog but
didn't touch the actual patch, so I think git will do the right thing if it
arrives via two trees.

> CC: Russell King <linux@arm.linux.org.uk>
> CC: Bjorn Helgaas <bhelgaas@google.com>
> CC: Arnd Bergmann <arnd@arndb.de>
> CC: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
> CC: Santosh Shilimkar <santosh.shilimkar@ti.com>
> ---
>  - Fixed comments against initial version
>  arch/arm/kernel/bios32.c |   12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
> index 16d43cd..17a26c1 100644
> --- a/arch/arm/kernel/bios32.c
> +++ b/arch/arm/kernel/bios32.c
> @@ -545,6 +545,18 @@ void pci_common_init_dev(struct device *parent, struct hw_pci *hw)
>  		 */
>  		pci_bus_add_devices(bus);
>  	}
> +
> +	list_for_each_entry(sys, &head, node) {
> +		struct pci_bus *bus = sys->bus;
> +
> +		/* Configure PCI Express settings */
> +		if (bus && !pci_has_flag(PCI_PROBE_ONLY)) {
> +			struct pci_bus *child;
> +
> +			list_for_each_entry(child, &bus->children, node)
> +				pcie_bus_configure_settings(child);
> +		}
> +	}
>  }
>  
>  #ifndef CONFIG_PCI_HOST_ITE8152
> -- 
> 1.7.9.5
>
Murali Karicheri June 10, 2014, 2:32 p.m. UTC | #2
On 5/30/2014 11:44 AM, Bjorn Helgaas wrote:
> On Wed, May 28, 2014 at 01:14:53PM -0400, Murali Karicheri wrote:
>> Call pcie_bus_configure_settings on ARM, like for other platforms.
>> pcie_bus_configure_settings makes sure the MPS across the bus is
>> uniform and provides the ability to tune the MRSS and MPS to higher
>> performance values. This is particularly important for embedded where
>> there is no firmware to program these PCI-E settings for the OS.
>>
>> Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
> I applied this to pci/misc for v3.16.  Russell, let me know if you object
> or prefer another route, and I can drop it.  I tweaked the changelog but
> didn't touch the actual patch, so I think git will do the right thing if it
> arrives via two trees.
Bjorn,

I checked git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git 
pci/misc branch
I don't see it. Is it a different repo?

I see the following commits, but not this.

a43ae58c848cfbadaba81c8d63202b4487f922a0 PCI: Turn 
pcibios_penalize_isa_irq() into a weak function
78916b00f0096059c872f537306b1a464c84fb30 PCI: Test for std config alias 
when testing extended config space
9edbcd2252b5ef148177c9f2c11a56469cf5db52 PCI: Remove 
pcibios_add_platform_entries()
ef4858c64e836b0b9dbdb9ece13ce932d9fcd4ad s390/pci: use pdev->dev.groups 
for attribute creation
dfc73e7acd9925b434a355eeeed86d44cb435f9c PCI: Move Open Firmware devspec 
attribute to PCI common code
1e358f94c00570f88a590cabe718daf835440cc9 PCI: Fix use of uninitialized 
MPS value
efdd4070f38e962d69c11f23c5aa033121a8cf0f PCI: Remove dead code
cad01f9191226f069a0932a01b738bacde784a62 MAINTAINERS: Add 
arch/x86/kernel/quirks.c to PCI file patterns
10874f5a00266343a06e95da680e8a5a383d9a80 PCI: Remove unnecessary __ref 
annotations
8895d3bcb8ba960b1b83f95d772b641352ea8e51 PCI: Fail new_id for 
vendor/device values already built into driver
7c82126a94e69bbbac586f0249e7ef11e681246c PCI: Add new ID for Intel GPU 
"spurious interrupt" quirk
473153aff4b978006f1c5fbc0e9032fd11061709 PCI: Update my email address
67ebd8140dc8923c65451fa0f6a8eee003c4dcd3 PCI: Fix incorrect vgaarb 
conditional in WARN_ON()
c1309040967e200d3ea6415ae54cf6a69d7ad996 PCI: Use designated 
initialization in PCI_VDEVICE
7ee4910ab31c4b1fafb7e4f273cbe9340ac953aa PCI: Remove old serial device IDs
56a3d18279f00c7ccbcdc193ceaf1a2f88c51457 PCI: Remove unnecessary 
includes of <linux/init.h>
ff0c41b2df1577f3354f788af4f6bb5dbdfd26da powerpc/PCI: Fix NULL 
dereference in sys_pciconfig_iobase() list traversal
c9eaa447e77efe77b7fa4c953bd62de8297fd6c5 Linux 3.15-rc1


>> CC: Russell King <linux@arm.linux.org.uk>
>> CC: Bjorn Helgaas <bhelgaas@google.com>
>> CC: Arnd Bergmann <arnd@arndb.de>
>> CC: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
>> CC: Santosh Shilimkar <santosh.shilimkar@ti.com>
>> ---
>>   - Fixed comments against initial version
>>   arch/arm/kernel/bios32.c |   12 ++++++++++++
>>   1 file changed, 12 insertions(+)
>>
>> diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
>> index 16d43cd..17a26c1 100644
>> --- a/arch/arm/kernel/bios32.c
>> +++ b/arch/arm/kernel/bios32.c
>> @@ -545,6 +545,18 @@ void pci_common_init_dev(struct device *parent, struct hw_pci *hw)
>>   		 */
>>   		pci_bus_add_devices(bus);
>>   	}
>> +
>> +	list_for_each_entry(sys, &head, node) {
>> +		struct pci_bus *bus = sys->bus;
>> +
>> +		/* Configure PCI Express settings */
>> +		if (bus && !pci_has_flag(PCI_PROBE_ONLY)) {
>> +			struct pci_bus *child;
>> +
>> +			list_for_each_entry(child, &bus->children, node)
>> +				pcie_bus_configure_settings(child);
>> +		}
>> +	}
>>   }
>>   
>>   #ifndef CONFIG_PCI_HOST_ITE8152
>> -- 
>> 1.7.9.5
>>
Bjorn Helgaas June 10, 2014, 5:32 p.m. UTC | #3
On Tue, Jun 10, 2014 at 8:32 AM, Murali Karicheri <m-karicheri2@ti.com> wrote:
> On 5/30/2014 11:44 AM, Bjorn Helgaas wrote:
>>
>> On Wed, May 28, 2014 at 01:14:53PM -0400, Murali Karicheri wrote:
>>>
>>> Call pcie_bus_configure_settings on ARM, like for other platforms.
>>> pcie_bus_configure_settings makes sure the MPS across the bus is
>>> uniform and provides the ability to tune the MRSS and MPS to higher
>>> performance values. This is particularly important for embedded where
>>> there is no firmware to program these PCI-E settings for the OS.
>>>
>>> Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
>>
>> I applied this to pci/misc for v3.16.  Russell, let me know if you object
>> or prefer another route, and I can drop it.  I tweaked the changelog but
>> didn't touch the actual patch, so I think git will do the right thing if
>> it
>> arrives via two trees.
>
> Bjorn,
>
> I checked git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git
> pci/misc branch
> I don't see it. Is it a different repo?

It's already in Linus' tree and I cleaned out pci/misc for the next cycle.

http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=8b5742ad156d30ee38486652cdbd152e2d6ebbcc

>>> CC: Russell King <linux@arm.linux.org.uk>
>>> CC: Bjorn Helgaas <bhelgaas@google.com>
>>> CC: Arnd Bergmann <arnd@arndb.de>
>>> CC: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
>>> CC: Santosh Shilimkar <santosh.shilimkar@ti.com>
>>> ---
>>>   - Fixed comments against initial version
>>>   arch/arm/kernel/bios32.c |   12 ++++++++++++
>>>   1 file changed, 12 insertions(+)
>>>
>>> diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
>>> index 16d43cd..17a26c1 100644
>>> --- a/arch/arm/kernel/bios32.c
>>> +++ b/arch/arm/kernel/bios32.c
>>> @@ -545,6 +545,18 @@ void pci_common_init_dev(struct device *parent,
>>> struct hw_pci *hw)
>>>                  */
>>>                 pci_bus_add_devices(bus);
>>>         }
>>> +
>>> +       list_for_each_entry(sys, &head, node) {
>>> +               struct pci_bus *bus = sys->bus;
>>> +
>>> +               /* Configure PCI Express settings */
>>> +               if (bus && !pci_has_flag(PCI_PROBE_ONLY)) {
>>> +                       struct pci_bus *child;
>>> +
>>> +                       list_for_each_entry(child, &bus->children, node)
>>> +                               pcie_bus_configure_settings(child);
>>> +               }
>>> +       }
>>>   }
>>>     #ifndef CONFIG_PCI_HOST_ITE8152
>>> --
>>> 1.7.9.5
>>>
>
Bjorn Helgaas May 16, 2015, 2:02 p.m. UTC | #4
On Wed, May 28, 2014 at 01:14:53PM -0400, Murali Karicheri wrote:
> Call pcie_bus_configure_settings on ARM, like for other platforms.
> pcie_bus_configure_settings makes sure the MPS across the bus is
> uniform and provides the ability to tune the MRSS and MPS to higher
> performance values. This is particularly important for embedded where
> there is no firmware to program these PCI-E settings for the OS.
> 
> Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
> 
> CC: Russell King <linux@arm.linux.org.uk>
> CC: Bjorn Helgaas <bhelgaas@google.com>
> CC: Arnd Bergmann <arnd@arndb.de>
> CC: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
> CC: Santosh Shilimkar <santosh.shilimkar@ti.com>
> ---
>  - Fixed comments against initial version
>  arch/arm/kernel/bios32.c |   12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
> index 16d43cd..17a26c1 100644
> --- a/arch/arm/kernel/bios32.c
> +++ b/arch/arm/kernel/bios32.c
> @@ -545,6 +545,18 @@ void pci_common_init_dev(struct device *parent, struct hw_pci *hw)
>  		 */
>  		pci_bus_add_devices(bus);
>  	}
> +
> +	list_for_each_entry(sys, &head, node) {
> +		struct pci_bus *bus = sys->bus;
> +
> +		/* Configure PCI Express settings */
> +		if (bus && !pci_has_flag(PCI_PROBE_ONLY)) {
> +			struct pci_bus *child;
> +
> +			list_for_each_entry(child, &bus->children, node)
> +				pcie_bus_configure_settings(child);

This patch (8b5742ad156d ("ARM/PCI: Call pcie_bus_configure_settings() to
set MPS")) has been upstream since v3.16-rc1, but I think we goofed.

The MPS configuration should be done *before* pci_bus_add_devices().  After
pci_bus_add_devices(), drivers may be bound to devices, and the PCI core
shouldn't touch device configuration while a driver owns the device.

Looking at the code, it seems like it would have been simpler to do this in
the existing loop:

  list_for_each_entry(sys, &head, node) {
    struct pci_bus *bus = sys->bus;

    if (bus && !pci_has_flag(PCI_PROBE_ONLY)) {
      pci_bus_size_bridges(bus);
      pci_bus_assign_resources(bus);
      list_for_each_entry(child, &bus->children, node)
        pcie_bus_configure_settings(child);
    }

    pci_bus_add_devices(bus);
  }

so maybe there's some reason I'm not aware of for not doing it that way?

> +		}
> +	}
>  }
>  
>  #ifndef CONFIG_PCI_HOST_ITE8152
> -- 
> 1.7.9.5
>
diff mbox

Patch

diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
index 16d43cd..17a26c1 100644
--- a/arch/arm/kernel/bios32.c
+++ b/arch/arm/kernel/bios32.c
@@ -545,6 +545,18 @@  void pci_common_init_dev(struct device *parent, struct hw_pci *hw)
 		 */
 		pci_bus_add_devices(bus);
 	}
+
+	list_for_each_entry(sys, &head, node) {
+		struct pci_bus *bus = sys->bus;
+
+		/* Configure PCI Express settings */
+		if (bus && !pci_has_flag(PCI_PROBE_ONLY)) {
+			struct pci_bus *child;
+
+			list_for_each_entry(child, &bus->children, node)
+				pcie_bus_configure_settings(child);
+		}
+	}
 }
 
 #ifndef CONFIG_PCI_HOST_ITE8152