diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2021-07-09 18:50:27 -0500 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2021-07-09 18:51:46 -0500 |
commit | 62efe3eebc8bfc351961eee769a5c2fc30221451 (patch) | |
tree | c50b497288f745bc631d344305a36981bc617959 /drivers | |
parent | 50be9417e23af5a8ac860d998e1e3f06b8fd79d7 (diff) |
Revert "PCI: Coalesce host bridge contiguous apertures"
This reverts commit 65db04053efea3f3e412a7e0cc599962999c96b4.
Guenter reported that after 65db04053efe, the ppc:sam460ex qemu emulation
no longer boots from nvme:
nvme nvme0: Device not ready; aborting initialisation, CSTS=0x0
nvme nvme0: Removing after probe failure status: -19
Link: https://lore.kernel.org/r/20210709231529.GA3270116@roeck-us.net
Reported-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/pci/probe.c | 50 |
1 files changed, 4 insertions, 46 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index cd6fcd848853..79177ac37880 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -19,7 +19,6 @@ #include <linux/hypervisor.h> #include <linux/irqdomain.h> #include <linux/pm_runtime.h> -#include <linux/list_sort.h> #include "pci.h" #define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */ @@ -875,31 +874,14 @@ static void pci_set_bus_msi_domain(struct pci_bus *bus) dev_set_msi_domain(&bus->dev, d); } -static int res_cmp(void *priv, const struct list_head *a, - const struct list_head *b) -{ - struct resource_entry *entry1, *entry2; - - entry1 = container_of(a, struct resource_entry, node); - entry2 = container_of(b, struct resource_entry, node); - - if (entry1->res->flags != entry2->res->flags) - return entry1->res->flags > entry2->res->flags; - - if (entry1->offset != entry2->offset) - return entry1->offset > entry2->offset; - - return entry1->res->start > entry2->res->start; -} - static int pci_register_host_bridge(struct pci_host_bridge *bridge) { struct device *parent = bridge->dev.parent; - struct resource_entry *window, *next, *n; + struct resource_entry *window, *n; struct pci_bus *bus, *b; - resource_size_t offset, next_offset; + resource_size_t offset; LIST_HEAD(resources); - struct resource *res, *next_res; + struct resource *res; char addr[64], *fmt; const char *name; int err; @@ -979,35 +961,11 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge) if (nr_node_ids > 1 && pcibus_to_node(bus) == NUMA_NO_NODE) dev_warn(&bus->dev, "Unknown NUMA node; performance will be reduced\n"); - /* Sort and coalesce contiguous windows */ - list_sort(NULL, &resources, res_cmp); - resource_list_for_each_entry_safe(window, n, &resources) { - if (list_is_last(&window->node, &resources)) - break; - - next = list_next_entry(window, node); - offset = window->offset; - res = window->res; - next_offset = next->offset; - next_res = next->res; - - if (res->flags != next_res->flags || offset != next_offset) - continue; - - if (res->end + 1 == next_res->start) { - next_res->start = res->start; - res->flags = res->start = res->end = 0; - } - } - /* Add initial resources to the bus */ resource_list_for_each_entry_safe(window, n, &resources) { + list_move_tail(&window->node, &bridge->windows); offset = window->offset; res = window->res; - if (!res->end) - continue; - - list_move_tail(&window->node, &bridge->windows); if (res->flags & IORESOURCE_BUS) pci_bus_insert_busn_res(bus, bus->number, res->end); |