* [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).