Commit fb6b6cc4 authored by Bjorn Helgaas's avatar Bjorn Helgaas

Merge branch 'pci/enumeration' into next

* pci/enumeration:
  PCI: tegra: Fix pci_remap_iospace() failure path
  PCI: generic: Fix pci_remap_iospace() failure path
  PCI: rcar: Fix pci_remap_iospace() failure path
  PCI: versatile: Fix pci_remap_iospace() failure path
  PCI: designware: Fix pci_remap_iospace() failure path
  PCI: aardvark: Fix pci_remap_iospace() failure path
parents 4dc2db09 13f392eb
...@@ -848,7 +848,7 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie) ...@@ -848,7 +848,7 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie)
int err, res_valid = 0; int err, res_valid = 0;
struct device *dev = &pcie->pdev->dev; struct device *dev = &pcie->pdev->dev;
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
struct resource_entry *win; struct resource_entry *win, *tmp;
resource_size_t iobase; resource_size_t iobase;
INIT_LIST_HEAD(&pcie->resources); INIT_LIST_HEAD(&pcie->resources);
...@@ -862,7 +862,7 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie) ...@@ -862,7 +862,7 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie)
if (err) if (err)
goto out_release_res; goto out_release_res;
resource_list_for_each_entry(win, &pcie->resources) { resource_list_for_each_entry_safe(win, tmp, &pcie->resources) {
struct resource *res = win->res; struct resource *res = win->res;
switch (resource_type(res)) { switch (resource_type(res)) {
...@@ -874,9 +874,11 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie) ...@@ -874,9 +874,11 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie)
lower_32_bits(res->start), lower_32_bits(res->start),
OB_PCIE_IO); OB_PCIE_IO);
err = pci_remap_iospace(res, iobase); err = pci_remap_iospace(res, iobase);
if (err) if (err) {
dev_warn(dev, "error %d: failed to map resource %pR\n", dev_warn(dev, "error %d: failed to map resource %pR\n",
err, res); err, res);
resource_list_destroy_entry(win);
}
break; break;
case IORESOURCE_MEM: case IORESOURCE_MEM:
advk_pcie_set_ob_win(pcie, 0, advk_pcie_set_ob_win(pcie, 0,
......
...@@ -30,7 +30,7 @@ static int gen_pci_parse_request_of_pci_ranges(struct device *dev, ...@@ -30,7 +30,7 @@ static int gen_pci_parse_request_of_pci_ranges(struct device *dev,
int err, res_valid = 0; int err, res_valid = 0;
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
resource_size_t iobase; resource_size_t iobase;
struct resource_entry *win; struct resource_entry *win, *tmp;
err = of_pci_get_host_bridge_resources(np, 0, 0xff, resources, &iobase); err = of_pci_get_host_bridge_resources(np, 0, 0xff, resources, &iobase);
if (err) if (err)
...@@ -40,15 +40,17 @@ static int gen_pci_parse_request_of_pci_ranges(struct device *dev, ...@@ -40,15 +40,17 @@ static int gen_pci_parse_request_of_pci_ranges(struct device *dev,
if (err) if (err)
return err; return err;
resource_list_for_each_entry(win, resources) { resource_list_for_each_entry_safe(win, tmp, resources) {
struct resource *res = win->res; struct resource *res = win->res;
switch (resource_type(res)) { switch (resource_type(res)) {
case IORESOURCE_IO: case IORESOURCE_IO:
err = pci_remap_iospace(res, iobase); err = pci_remap_iospace(res, iobase);
if (err) if (err) {
dev_warn(dev, "error %d: failed to map resource %pR\n", dev_warn(dev, "error %d: failed to map resource %pR\n",
err, res); err, res);
resource_list_destroy_entry(win);
}
break; break;
case IORESOURCE_MEM: case IORESOURCE_MEM:
res_valid |= !(res->flags & IORESOURCE_PREFETCH); res_valid |= !(res->flags & IORESOURCE_PREFETCH);
......
...@@ -621,7 +621,11 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys) ...@@ -621,7 +621,11 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
if (err < 0) if (err < 0)
return err; return err;
pci_add_resource_offset(&sys->resources, &pcie->pio, sys->io_offset); err = pci_remap_iospace(&pcie->pio, pcie->io.start);
if (!err)
pci_add_resource_offset(&sys->resources, &pcie->pio,
sys->io_offset);
pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset); pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset);
pci_add_resource_offset(&sys->resources, &pcie->prefetch, pci_add_resource_offset(&sys->resources, &pcie->prefetch,
sys->mem_offset); sys->mem_offset);
...@@ -631,7 +635,6 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys) ...@@ -631,7 +635,6 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
if (err < 0) if (err < 0)
return err; return err;
pci_remap_iospace(&pcie->pio, pcie->io.start);
return 1; return 1;
} }
......
...@@ -74,7 +74,7 @@ static int versatile_pci_parse_request_of_pci_ranges(struct device *dev, ...@@ -74,7 +74,7 @@ static int versatile_pci_parse_request_of_pci_ranges(struct device *dev,
int err, mem = 1, res_valid = 0; int err, mem = 1, res_valid = 0;
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
resource_size_t iobase; 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); err = of_pci_get_host_bridge_resources(np, 0, 0xff, res, &iobase);
if (err) if (err)
...@@ -84,15 +84,17 @@ static int versatile_pci_parse_request_of_pci_ranges(struct device *dev, ...@@ -84,15 +84,17 @@ static int versatile_pci_parse_request_of_pci_ranges(struct device *dev,
if (err) if (err)
goto out_release_res; 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; struct resource *res = win->res;
switch (resource_type(res)) { switch (resource_type(res)) {
case IORESOURCE_IO: case IORESOURCE_IO:
err = pci_remap_iospace(res, iobase); err = pci_remap_iospace(res, iobase);
if (err) if (err) {
dev_warn(dev, "error %d: failed to map resource %pR\n", dev_warn(dev, "error %d: failed to map resource %pR\n",
err, res); err, res);
resource_list_destroy_entry(win);
}
break; break;
case IORESOURCE_MEM: case IORESOURCE_MEM:
res_valid |= !(res->flags & IORESOURCE_PREFETCH); res_valid |= !(res->flags & IORESOURCE_PREFETCH);
......
...@@ -435,7 +435,7 @@ int dw_pcie_host_init(struct pcie_port *pp) ...@@ -435,7 +435,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
struct resource *cfg_res; struct resource *cfg_res;
int i, ret; int i, ret;
LIST_HEAD(res); LIST_HEAD(res);
struct resource_entry *win; struct resource_entry *win, *tmp;
cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config"); cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config");
if (cfg_res) { if (cfg_res) {
...@@ -456,17 +456,20 @@ int dw_pcie_host_init(struct pcie_port *pp) ...@@ -456,17 +456,20 @@ int dw_pcie_host_init(struct pcie_port *pp)
goto error; goto error;
/* Get the I/O and memory ranges from DT */ /* Get the I/O and memory ranges from DT */
resource_list_for_each_entry(win, &res) { resource_list_for_each_entry_safe(win, tmp, &res) {
switch (resource_type(win->res)) { switch (resource_type(win->res)) {
case IORESOURCE_IO: case IORESOURCE_IO:
pp->io = win->res; ret = pci_remap_iospace(win->res, pp->io_base);
pp->io->name = "I/O"; if (ret) {
pp->io_size = resource_size(pp->io);
pp->io_bus_addr = pp->io->start - win->offset;
ret = pci_remap_iospace(pp->io, pp->io_base);
if (ret)
dev_warn(pp->dev, "error %d: failed to map resource %pR\n", dev_warn(pp->dev, "error %d: failed to map resource %pR\n",
ret, pp->io); ret, win->res);
resource_list_destroy_entry(win);
} else {
pp->io = win->res;
pp->io->name = "I/O";
pp->io_size = resource_size(pp->io);
pp->io_bus_addr = pp->io->start - win->offset;
}
break; break;
case IORESOURCE_MEM: case IORESOURCE_MEM:
pp->mem = win->res; pp->mem = win->res;
......
...@@ -945,7 +945,7 @@ static int rcar_pcie_parse_request_of_pci_ranges(struct rcar_pcie *pci) ...@@ -945,7 +945,7 @@ static int rcar_pcie_parse_request_of_pci_ranges(struct rcar_pcie *pci)
struct device *dev = pci->dev; struct device *dev = pci->dev;
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
resource_size_t iobase; resource_size_t iobase;
struct resource_entry *win; struct resource_entry *win, *tmp;
err = of_pci_get_host_bridge_resources(np, 0, 0xff, &pci->resources, &iobase); err = of_pci_get_host_bridge_resources(np, 0, 0xff, &pci->resources, &iobase);
if (err) if (err)
...@@ -955,14 +955,17 @@ static int rcar_pcie_parse_request_of_pci_ranges(struct rcar_pcie *pci) ...@@ -955,14 +955,17 @@ static int rcar_pcie_parse_request_of_pci_ranges(struct rcar_pcie *pci)
if (err) if (err)
goto out_release_res; goto out_release_res;
resource_list_for_each_entry(win, &pci->resources) { resource_list_for_each_entry_safe(win, tmp, &pci->resources) {
struct resource *res = win->res; struct resource *res = win->res;
if (resource_type(res) == IORESOURCE_IO) { if (resource_type(res) == IORESOURCE_IO) {
err = pci_remap_iospace(res, iobase); err = pci_remap_iospace(res, iobase);
if (err) if (err) {
dev_warn(dev, "error %d: failed to map resource %pR\n", dev_warn(dev, "error %d: failed to map resource %pR\n",
err, res); err, res);
resource_list_destroy_entry(win);
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment