lkml.org 
[lkml]   [2010]   [Jan]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 08/11] 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...

    -v2: use resource_list_x

    Signed-off-by: Yinghai Lu <yinghai@kernel.org>
    ---
    drivers/pci/setup-bus.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++-
    1 files changed, 49 insertions(+), 1 deletions(-)

    diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
    index c348882..2ff34ca 100644
    --- a/drivers/pci/setup-bus.c
    +++ b/drivers/pci/setup-bus.c
    @@ -1009,12 +1009,60 @@ void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge)
    {
    struct pci_bus *bus;
    struct pci_bus *parent = bridge->subordinate;
    + bool second_tried = false;
    + struct resource_list_x head, *list;
    int retval;
    + unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM |
    + IORESOURCE_PREFETCH;
    +
    + head.next = NULL;

    +again:
    pci_bus_size_bridges(parent);
    - __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 need 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->flags;
    +
    + bus = list->dev->bus;
    + pci_bus_release_bridge_resources(bus, flags & type_mask,
    + whole_subtree);
    + list = list->next;
    + }
    + /* retore size and flags */
    + for (list = head.next; list;) {
    + struct resource *res = list->res;
    +
    + res->start = list->start;
    + res->end = list->end;
    + res->flags = list->flags;
    + if (list->dev->subordinate)
    + res->flags = 0;
    +
    + list = list->next;
    + }
    + free_failed_list(&head);
    +
    + goto again;
    }
    EXPORT_SYMBOL_GPL(pci_assign_unassigned_bridge_resources);
    --
    1.6.4.2


    \
     
     \ /
      Last update: 2010-01-16 03:45    [W:0.023 / U:29.616 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site