lkml.org 
[lkml]   [2016]   [Oct]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.8 122/125] PCI: versatile: Fix pci_remap_iospace() failure path
    Date
    4.8-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>

    commit 53f4f7ee28076a36e427274d7d5c33b23dfc6221 upstream.

    On ARM/ARM64 architectures, PCI IO ports are emulated through memory mapped
    IO, by reserving a chunk of virtual address space starting at PCI_IOBASE
    and by mapping the PCI host bridges memory address space driving PCI IO
    cycles to it.

    PCI host bridge drivers that enable downstream PCI IO cycles map the host
    bridge memory address responding to PCI IO cycles to the fixed virtual
    address space through the pci_remap_iospace() API.

    This means that if the pci_remap_iospace() function fails, the
    corresponding host bridge PCI IO resource must be considered invalid, in
    that there is no way for the kernel to actually drive PCI IO transactions
    if the memory addresses responding to PCI IO cycles cannot be mapped into
    the CPU virtual address space.

    The PCI versatile host bridge driver does not remove the PCI IO resource
    from the host bridge resource windows if the pci_remap_iospace() call
    fails; this is an actual bug in that the PCI host bridge would consider the
    PCI IO resource valid (and possibly assign it to downstream devices) even
    if the kernel was not able to map the PCI host bridge memory address
    driving IO cycle to the CPU virtual address space (ie pci_remap_iospace()
    failures).

    Fix the PCI host bridge driver pci_remap_iospace() failure path, by
    destroying the PCI host bridge PCI IO resources retrieved through firmware
    when the pci_remap_iospace() function call fails, therefore preventing the
    kernel from adding the respective PCI IO resource to the list of PCI host
    bridge valid resources, fixing the issue.

    Fixes: b7e78170efd4 ("PCI: versatile: Add DT-based ARM Versatile PB PCIe host driver")
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    CC: Rob Herring <robh@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/pci/host/pci-versatile.c | 8 +++++---
    1 file changed, 5 insertions(+), 3 deletions(-)

    --- a/drivers/pci/host/pci-versatile.c
    +++ b/drivers/pci/host/pci-versatile.c
    @@ -74,7 +74,7 @@ static int versatile_pci_parse_request_o
    int err, mem = 1, res_valid = 0;
    struct device_node *np = dev->of_node;
    resource_size_t iobase;
    - struct resource_entry *win;
    + struct resource_entry *win, *tmp;

    err = of_pci_get_host_bridge_resources(np, 0, 0xff, res, &iobase);
    if (err)
    @@ -84,15 +84,17 @@ static int versatile_pci_parse_request_o
    if (err)
    goto out_release_res;

    - resource_list_for_each_entry(win, res) {
    + resource_list_for_each_entry_safe(win, tmp, res) {
    struct resource *res = win->res;

    switch (resource_type(res)) {
    case IORESOURCE_IO:
    err = pci_remap_iospace(res, iobase);
    - if (err)
    + if (err) {
    dev_warn(dev, "error %d: failed to map resource %pR\n",
    err, res);
    + resource_list_destroy_entry(win);
    + }
    break;
    case IORESOURCE_MEM:
    res_valid |= !(res->flags & IORESOURCE_PREFETCH);

    \
     
     \ /
      Last update: 2016-10-29 15:58    [W:4.122 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site