]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/pci/setup-bus.c
Merge tag '5.6-rc-small-smb3-fix-for-stable' of git://git.samba.org/sfrench/cifs-2.6
[linux.git] / drivers / pci / setup-bus.c
index d76674ec712ce4b39ba89a21862caa4eb61411a3..f2461bf9243df4a965c8f2662959aba8c649805a 100644 (file)
@@ -1838,29 +1838,30 @@ void __init pci_assign_unassigned_resources(void)
        }
 }
 
-static void extend_bridge_window(struct pci_dev *bridge, struct resource *res,
+static void adjust_bridge_window(struct pci_dev *bridge, struct resource *res,
                                 struct list_head *add_list,
-                                resource_size_t available)
+                                resource_size_t new_size)
 {
-       struct pci_dev_resource *dev_res;
+       resource_size_t add_size, size = resource_size(res);
 
        if (res->parent)
                return;
 
-       if (resource_size(res) >= available)
-               return;
-
-       dev_res = res_to_dev_res(add_list, res);
-       if (!dev_res)
+       if (!new_size)
                return;
 
-       /* Is there room to extend the window? */
-       if (available - resource_size(res) <= dev_res->add_size)
-               return;
+       if (new_size > size) {
+               add_size = new_size - size;
+               pci_dbg(bridge, "bridge window %pR extended by %pa\n", res,
+                       &add_size);
+       } else if (new_size < size) {
+               add_size = size - new_size;
+               pci_dbg(bridge, "bridge window %pR shrunken by %pa\n", res,
+                       &add_size);
+       }
 
-       dev_res->add_size = available - resource_size(res);
-       pci_dbg(bridge, "bridge window %pR extended by %pa\n", res,
-               &dev_res->add_size);
+       res->end = res->start + new_size - 1;
+       remove_from_list(add_list, res);
 }
 
 static void pci_bus_distribute_available_resources(struct pci_bus *bus,
@@ -1896,14 +1897,12 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus,
                        mmio_pref.end + 1);
 
        /*
-        * Update additional resource list (add_list) to fill all the
-        * extra resource space available for this port except the space
-        * calculated in __pci_bus_size_bridges() which covers all the
-        * devices currently connected to the port and below.
+        * Now that we have adjusted for alignment, update the bridge window
+        * resources to fill as much remaining resource space as possible.
         */
-       extend_bridge_window(bridge, io_res, add_list, resource_size(&io));
-       extend_bridge_window(bridge, mmio_res, add_list, resource_size(&mmio));
-       extend_bridge_window(bridge, mmio_pref_res, add_list,
+       adjust_bridge_window(bridge, io_res, add_list, resource_size(&io));
+       adjust_bridge_window(bridge, mmio_res, add_list, resource_size(&mmio));
+       adjust_bridge_window(bridge, mmio_pref_res, add_list,
                             resource_size(&mmio_pref));
 
        /*