lkml.org 
[lkml]   [2016]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v13 08/16] sparc/PCI: Keep resource idx order with bridge register number
    Date
    On one system found strange "no compatible bridge window" warning
    even we already had pref_compat support that add extra pref bit for device
    resource.

    PCI: Claiming 0000:00:01.0: Resource 14: 0002000100000000..000200010fffffff [10220c]
    PCI: Claiming 0000:01:00.0: Resource 1: 0002000100000000..000200010000ffff [100214]
    pci 0000:01:00.0: can't claim BAR 1 [mem 0x2000100000000-0x200010000ffff 64bit]: no compatible bridge window

    It turns out that pci_resource_compatible()/pci_up_path_over_pref_mem64()
    just check resource with bridge pref mmio register idx 15, and we have put
    resource to use mmio register idx 14 during of_scan_pci_bridge()
    as the bridge does not have mmio resource.

    We already fix pci_up_path_over_pref_mem64() to check all bus resources.

    And at the same time, this patch make resource to have consistent sequence
    like other arch or directly from pci_read_bridge_bases(),
    even when non-pref mmio is missing, or out of ordering in firmware reporting.

    Just hold i = 1 for non pref mmio, and i = 2 for pref mmio.

    Signed-off-by: Yinghai Lu <yinghai@kernel.org>
    Tested-by: Khalid Aziz <khalid.aziz@oracle.com>
    Cc: sparclinux@vger.kernel.org
    ---
    arch/sparc/kernel/pci.c | 8 +++++++-
    1 file changed, 7 insertions(+), 1 deletion(-)

    diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c
    index 654cf21..c6a3971 100644
    --- a/arch/sparc/kernel/pci.c
    +++ b/arch/sparc/kernel/pci.c
    @@ -481,7 +481,7 @@ static void of_scan_pci_bridge(struct pci_pbm_info *pbm,
    pci_read_bridge_bases(bus);
    goto after_ranges;
    }
    - i = 1;
    + i = 3;
    for (; len >= 32; len -= 32, ranges += 8) {
    u64 start;

    @@ -513,6 +513,12 @@ static void of_scan_pci_bridge(struct pci_pbm_info *pbm,
    " for bridge %s\n", node->full_name);
    continue;
    }
    + } else if ((flags & IORESOURCE_PREFETCH) &&
    + !bus->resource[2]->flags) {
    + res = bus->resource[2];
    + } else if (((flags & (IORESOURCE_MEM | IORESOURCE_PREFETCH)) ==
    + IORESOURCE_MEM) && !bus->resource[1]->flags) {
    + res = bus->resource[1];
    } else {
    if (i >= PCI_NUM_RESOURCES - PCI_BRIDGE_RESOURCES) {
    printk(KERN_ERR "PCI: too many memory ranges"
    --
    2.8.3
    \
     
     \ /
      Last update: 2016-06-18 04:41    [W:2.463 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site