linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1] ARM: pci: add call to pcie_bus_configure_settings()
@ 2014-05-28 17:14 Murali Karicheri
  2014-05-30 15:44 ` Bjorn Helgaas
  2015-05-16 14:02 ` Bjorn Helgaas
  0 siblings, 2 replies; 7+ messages in thread
From: Murali Karicheri @ 2014-05-28 17:14 UTC (permalink / raw)
  To: linux-pci, linux-arm-kernel, linux-kernel
  Cc: Murali Karicheri, Russell King, Bjorn Helgaas, Arnd Bergmann,
	Jason Gunthorpe, Santosh Shilimkar

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);
+		}
+	}
 }
 
 #ifndef CONFIG_PCI_HOST_ITE8152
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v1] ARM: pci: add call to pcie_bus_configure_settings()
  2014-05-28 17:14 [PATCH v1] ARM: pci: add call to pcie_bus_configure_settings() Murali Karicheri
@ 2014-05-30 15:44 ` Bjorn Helgaas
  2014-06-10 14:32   ` Murali Karicheri
  2015-05-16 14:02 ` Bjorn Helgaas
  1 sibling, 1 reply; 7+ messages in thread
From: Bjorn Helgaas @ 2014-05-30 15:44 UTC (permalink / raw)
  To: Murali Karicheri
  Cc: linux-pci, linux-arm-kernel, linux-kernel, Russell King,
	Arnd Bergmann, Jason Gunthorpe, Santosh Shilimkar

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
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v1] ARM: pci: add call to pcie_bus_configure_settings()
  2014-05-30 15:44 ` Bjorn Helgaas
@ 2014-06-10 14:32   ` Murali Karicheri
  2014-06-10 17:32     ` Bjorn Helgaas
  0 siblings, 1 reply; 7+ messages in thread
From: Murali Karicheri @ 2014-06-10 14:32 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: linux-pci, linux-arm-kernel, linux-kernel, Russell King,
	Arnd Bergmann, Jason Gunthorpe, Shilimkar, Santosh

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
>>


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v1] ARM: pci: add call to pcie_bus_configure_settings()
  2014-06-10 14:32   ` Murali Karicheri
@ 2014-06-10 17:32     ` Bjorn Helgaas
  0 siblings, 0 replies; 7+ messages in thread
From: Bjorn Helgaas @ 2014-06-10 17:32 UTC (permalink / raw)
  To: Murali Karicheri
  Cc: linux-pci, linux-arm-kernel, linux-kernel, Russell King,
	Arnd Bergmann, Jason Gunthorpe, Shilimkar, Santosh

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
>>>
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v1] ARM: pci: add call to pcie_bus_configure_settings()
  2014-05-28 17:14 [PATCH v1] ARM: pci: add call to pcie_bus_configure_settings() Murali Karicheri
  2014-05-30 15:44 ` Bjorn Helgaas
@ 2015-05-16 14:02 ` Bjorn Helgaas
  2015-07-16 19:13   ` Murali Karicheri
  1 sibling, 1 reply; 7+ messages in thread
From: Bjorn Helgaas @ 2015-05-16 14:02 UTC (permalink / raw)
  To: Murali Karicheri
  Cc: linux-pci, linux-arm-kernel, linux-kernel, Russell King,
	Arnd Bergmann, Jason Gunthorpe, Santosh Shilimkar

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
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v1] ARM: pci: add call to pcie_bus_configure_settings()
  2015-05-16 14:02 ` Bjorn Helgaas
@ 2015-07-16 19:13   ` Murali Karicheri
  2015-07-16 19:36     ` Bjorn Helgaas
  0 siblings, 1 reply; 7+ messages in thread
From: Murali Karicheri @ 2015-07-16 19:13 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: linux-pci, linux-arm-kernel, linux-kernel, Russell King,
	Arnd Bergmann, Jason Gunthorpe

On 05/16/2015 10:02 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>
>>
>> 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?

Bjorn,

This one has escaped my radar and I found it recently while I was 
searching for something else. I can't recall why this was not done this 
way. However I have tried the below code on Keystone and it works fine.

diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
index fcbbbb1..17efde7 100644
--- a/arch/arm/kernel/bios32.c
+++ b/arch/arm/kernel/bios32.c
@@ -520,7 +520,8 @@ void pci_common_init_dev(struct device *parent, 
struct hw_pci *hw)
         list_for_each_entry(sys, &head, node) {
                 struct pci_bus *bus = sys->bus;

-               if (!pci_has_flag(PCI_PROBE_ONLY)) {
+               if (bus && !pci_has_flag(PCI_PROBE_ONLY)) {
+                       struct pci_bus *child;
                         /*
                          * Size the bridge windows.
                          */
@@ -530,25 +531,15 @@ void pci_common_init_dev(struct device *parent, 
struct hw_pci *hw)
                          * Assign resources.
                          */
                         pci_bus_assign_resources(bus);
-               }

+                       list_for_each_entry(child, &bus->children, node)
+                               pcie_bus_configure_settings(child);
+               }
                 /*
                  * Tell drivers about devices found.
                  */
                 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);
-               }
-       }
  }

The SATA comes up fine and ahci is able to override the mrrs value as 
shown by the log below.

[    1.581526] ahci 0001:01:00.0: limiting MRRS to 256
[    1.586521] ahci 0001:01:00.0: AHCI 0001.0000 32 slots 2 ports 6 Gbps 
0x3 impl SATA mode
[    1.594604] ahci 0001:01:00.0: flags: 64bit ncq sntf led only pmp fbs 
pio slum part sxs
[    1.603772] scsi host0: ahci
[    1.606976] scsi host1: ahci
[

If you are fine, I can send a patch for this. Please confirm.

Murali

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


-- 
Murali Karicheri
Linux Kernel, Keystone

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v1] ARM: pci: add call to pcie_bus_configure_settings()
  2015-07-16 19:13   ` Murali Karicheri
@ 2015-07-16 19:36     ` Bjorn Helgaas
  0 siblings, 0 replies; 7+ messages in thread
From: Bjorn Helgaas @ 2015-07-16 19:36 UTC (permalink / raw)
  To: Murali Karicheri
  Cc: linux-pci, linux-arm, linux-kernel, Russell King, Arnd Bergmann,
	Jason Gunthorpe

On Thu, Jul 16, 2015 at 2:13 PM, Murali Karicheri <m-karicheri2@ti.com> wrote:
> On 05/16/2015 10:02 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>
>>>
>>> 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?
>
>
> Bjorn,
>
> This one has escaped my radar and I found it recently while I was searching
> for something else. I can't recall why this was not done this way. However I
> have tried the below code on Keystone and it works fine.
>
> diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
> index fcbbbb1..17efde7 100644
> --- a/arch/arm/kernel/bios32.c
> +++ b/arch/arm/kernel/bios32.c
> @@ -520,7 +520,8 @@ void pci_common_init_dev(struct device *parent, struct
> hw_pci *hw)
>         list_for_each_entry(sys, &head, node) {
>                 struct pci_bus *bus = sys->bus;
>
> -               if (!pci_has_flag(PCI_PROBE_ONLY)) {
> +               if (bus && !pci_has_flag(PCI_PROBE_ONLY)) {
> +                       struct pci_bus *child;
>                         /*
>                          * Size the bridge windows.
>                          */
> @@ -530,25 +531,15 @@ void pci_common_init_dev(struct device *parent, struct
> hw_pci *hw)
>                          * Assign resources.
>                          */
>                         pci_bus_assign_resources(bus);
> -               }
>
> +                       list_for_each_entry(child, &bus->children, node)
> +                               pcie_bus_configure_settings(child);
> +               }
>                 /*
>                  * Tell drivers about devices found.
>                  */
>                 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);
> -               }
> -       }
>  }
>
> The SATA comes up fine and ahci is able to override the mrrs value as shown
> by the log below.
>
> [    1.581526] ahci 0001:01:00.0: limiting MRRS to 256
> [    1.586521] ahci 0001:01:00.0: AHCI 0001.0000 32 slots 2 ports 6 Gbps 0x3
> impl SATA mode
> [    1.594604] ahci 0001:01:00.0: flags: 64bit ncq sntf led only pmp fbs pio
> slum part sxs
> [    1.603772] scsi host0: ahci
> [    1.606976] scsi host1: ahci
> [
>
> If you are fine, I can send a patch for this. Please confirm.

Yes, please!  I think the existing code that calls
pci_bus_add_devices() before configuring MPS is wrong, because MPS
should be configured before drivers can claim the device.

Bjorn

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-07-16 19:36 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-28 17:14 [PATCH v1] ARM: pci: add call to pcie_bus_configure_settings() Murali Karicheri
2014-05-30 15:44 ` Bjorn Helgaas
2014-06-10 14:32   ` Murali Karicheri
2014-06-10 17:32     ` Bjorn Helgaas
2015-05-16 14:02 ` Bjorn Helgaas
2015-07-16 19:13   ` Murali Karicheri
2015-07-16 19:36     ` Bjorn Helgaas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).