lkml.org 
[lkml]   [2009]   [Nov]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 9/9] pci: pciehp second try to get big range for pcie devices

    handle the case the slot bridge that doesn't get pre-allocated big enough res
    from FW.
    for example pcie devices need 256M, but the bridge only get preallocated 2M...

    Signed-off-by: Yinghai Lu <yinghai@kernel.org>

    ---
    drivers/pci/setup-bus.c | 41 ++++++++++++++++++++++++++++++++++++++++-
    1 file changed, 40 insertions(+), 1 deletion(-)

    Index: linux-2.6/drivers/pci/setup-bus.c
    ===================================================================
    --- linux-2.6.orig/drivers/pci/setup-bus.c
    +++ linux-2.6/drivers/pci/setup-bus.c
    @@ -970,13 +970,52 @@ void pci_assign_unassigned_bridge_resour
    {
    struct pci_bus *bus;
    struct pci_bus *parent = bridge->subordinate;
    + bool second_tried = false;
    + struct resource_list head, *list, *tmp;
    int retval;
    + unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM |
    + IORESOURCE_PREFETCH;
    +
    +again:
    + head.next = NULL;

    pci_bus_size_bridges(parent);
    pci_clear_master(bridge);
    - __pci_bridge_assign_resources(bridge, NULL);
    + __pci_bridge_assign_resources(bridge, &head);
    retval = pci_reenable_device(bridge);
    pci_set_master(bridge);
    pci_enable_bridges(parent);
    +
    + /* any device complain? */
    + if (!head.next)
    + return;
    +
    + if (second_tried) {
    + /* still fail, don't want to try more */
    + free_failed_list(&head);
    + return;
    + }
    +
    + second_tried = true;
    + printk(KERN_DEBUG "PCI: second try to assign unassigned res\n");
    +
    + /*
    + * Try to release leaf bridge's resources that doesn't fit resource of
    + * child device under that bridge
    + */
    + for (list = head.next; list;) {
    + unsigned long flags = list->res->flags;
    +
    + bus = list->dev->bus;
    + if (list->dev->subordinate)
    + list->res->flags = 0;
    + pci_bus_release_unused_bridge_res(bus, flags & type_mask, 0);
    +
    + tmp = list;
    + list = list->next;
    + kfree(tmp);
    + }
    +
    + goto again;
    }
    EXPORT_SYMBOL_GPL(pci_assign_unassigned_bridge_resources);


    \
     
     \ /
      Last update: 2009-11-25 21:05    [W:0.050 / U:33.076 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site