aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/host
diff options
context:
space:
mode:
authorBjorn Helgaas <bhelgaas@google.com>2016-10-03 10:43:19 -0400
committerBjorn Helgaas <bhelgaas@google.com>2016-10-03 10:43:19 -0400
commitfb6b6cc41bed72cbafb0d01ab139a4a5ad673e01 (patch)
treea5af55477a61f7f5c7e507547fefafb0af8cdcf3 /drivers/pci/host
parent4dc2db096a9f7c0316bafc18ee00d89e0acf4ebf (diff)
parent13f392ebc37e31568fae72a73ee378ae22a9740f (diff)
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
Diffstat (limited to 'drivers/pci/host')
-rw-r--r--drivers/pci/host/pci-aardvark.c8
-rw-r--r--drivers/pci/host/pci-host-common.c8
-rw-r--r--drivers/pci/host/pci-tegra.c7
-rw-r--r--drivers/pci/host/pci-versatile.c8
-rw-r--r--drivers/pci/host/pcie-designware.c21
-rw-r--r--drivers/pci/host/pcie-rcar.c9
6 files changed, 38 insertions, 23 deletions
diff --git a/drivers/pci/host/pci-aardvark.c b/drivers/pci/host/pci-aardvark.c
index ef9893fa3176..4f5e567fd7e0 100644
--- a/drivers/pci/host/pci-aardvark.c
+++ b/drivers/pci/host/pci-aardvark.c
@@ -848,7 +848,7 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie)
848 int err, res_valid = 0; 848 int err, res_valid = 0;
849 struct device *dev = &pcie->pdev->dev; 849 struct device *dev = &pcie->pdev->dev;
850 struct device_node *np = dev->of_node; 850 struct device_node *np = dev->of_node;
851 struct resource_entry *win; 851 struct resource_entry *win, *tmp;
852 resource_size_t iobase; 852 resource_size_t iobase;
853 853
854 INIT_LIST_HEAD(&pcie->resources); 854 INIT_LIST_HEAD(&pcie->resources);
@@ -862,7 +862,7 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie)
862 if (err) 862 if (err)
863 goto out_release_res; 863 goto out_release_res;
864 864
865 resource_list_for_each_entry(win, &pcie->resources) { 865 resource_list_for_each_entry_safe(win, tmp, &pcie->resources) {
866 struct resource *res = win->res; 866 struct resource *res = win->res;
867 867
868 switch (resource_type(res)) { 868 switch (resource_type(res)) {
@@ -874,9 +874,11 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie)
874 lower_32_bits(res->start), 874 lower_32_bits(res->start),
875 OB_PCIE_IO); 875 OB_PCIE_IO);
876 err = pci_remap_iospace(res, iobase); 876 err = pci_remap_iospace(res, iobase);
877 if (err) 877 if (err) {
878 dev_warn(dev, "error %d: failed to map resource %pR\n", 878 dev_warn(dev, "error %d: failed to map resource %pR\n",
879 err, res); 879 err, res);
880 resource_list_destroy_entry(win);
881 }
880 break; 882 break;
881 case IORESOURCE_MEM: 883 case IORESOURCE_MEM:
882 advk_pcie_set_ob_win(pcie, 0, 884 advk_pcie_set_ob_win(pcie, 0,
diff --git a/drivers/pci/host/pci-host-common.c b/drivers/pci/host/pci-host-common.c
index 946382fd4ea1..e3c48b5deb93 100644
--- a/drivers/pci/host/pci-host-common.c
+++ b/drivers/pci/host/pci-host-common.c
@@ -30,7 +30,7 @@ static int gen_pci_parse_request_of_pci_ranges(struct device *dev,
30 int err, res_valid = 0; 30 int err, res_valid = 0;
31 struct device_node *np = dev->of_node; 31 struct device_node *np = dev->of_node;
32 resource_size_t iobase; 32 resource_size_t iobase;
33 struct resource_entry *win; 33 struct resource_entry *win, *tmp;
34 34
35 err = of_pci_get_host_bridge_resources(np, 0, 0xff, resources, &iobase); 35 err = of_pci_get_host_bridge_resources(np, 0, 0xff, resources, &iobase);
36 if (err) 36 if (err)
@@ -40,15 +40,17 @@ static int gen_pci_parse_request_of_pci_ranges(struct device *dev,
40 if (err) 40 if (err)
41 return err; 41 return err;
42 42
43 resource_list_for_each_entry(win, resources) { 43 resource_list_for_each_entry_safe(win, tmp, resources) {
44 struct resource *res = win->res; 44 struct resource *res = win->res;
45 45
46 switch (resource_type(res)) { 46 switch (resource_type(res)) {
47 case IORESOURCE_IO: 47 case IORESOURCE_IO:
48 err = pci_remap_iospace(res, iobase); 48 err = pci_remap_iospace(res, iobase);
49 if (err) 49 if (err) {
50 dev_warn(dev, "error %d: failed to map resource %pR\n", 50 dev_warn(dev, "error %d: failed to map resource %pR\n",
51 err, res); 51 err, res);
52 resource_list_destroy_entry(win);
53 }
52 break; 54 break;
53 case IORESOURCE_MEM: 55 case IORESOURCE_MEM:
54 res_valid |= !(res->flags & IORESOURCE_PREFETCH); 56 res_valid |= !(res->flags & IORESOURCE_PREFETCH);
diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
index 6de0757b11e4..8c2590db609b 100644
--- a/drivers/pci/host/pci-tegra.c
+++ b/drivers/pci/host/pci-tegra.c
@@ -621,7 +621,11 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
621 if (err < 0) 621 if (err < 0)
622 return err; 622 return err;
623 623
624 pci_add_resource_offset(&sys->resources, &pcie->pio, sys->io_offset); 624 err = pci_remap_iospace(&pcie->pio, pcie->io.start);
625 if (!err)
626 pci_add_resource_offset(&sys->resources, &pcie->pio,
627 sys->io_offset);
628
625 pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset); 629 pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset);
626 pci_add_resource_offset(&sys->resources, &pcie->prefetch, 630 pci_add_resource_offset(&sys->resources, &pcie->prefetch,
627 sys->mem_offset); 631 sys->mem_offset);
@@ -631,7 +635,6 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
631 if (err < 0) 635 if (err < 0)
632 return err; 636 return err;
633 637
634 pci_remap_iospace(&pcie->pio, pcie->io.start);
635 return 1; 638 return 1;
636} 639}
637 640
diff --git a/drivers/pci/host/pci-versatile.c b/drivers/pci/host/pci-versatile.c
index f234405770ab..b7dc07002f13 100644
--- a/drivers/pci/host/pci-versatile.c
+++ b/drivers/pci/host/pci-versatile.c
@@ -74,7 +74,7 @@ static int versatile_pci_parse_request_of_pci_ranges(struct device *dev,
74 int err, mem = 1, res_valid = 0; 74 int err, mem = 1, res_valid = 0;
75 struct device_node *np = dev->of_node; 75 struct device_node *np = dev->of_node;
76 resource_size_t iobase; 76 resource_size_t iobase;
77 struct resource_entry *win; 77 struct resource_entry *win, *tmp;
78 78
79 err = of_pci_get_host_bridge_resources(np, 0, 0xff, res, &iobase); 79 err = of_pci_get_host_bridge_resources(np, 0, 0xff, res, &iobase);
80 if (err) 80 if (err)
@@ -84,15 +84,17 @@ static int versatile_pci_parse_request_of_pci_ranges(struct device *dev,
84 if (err) 84 if (err)
85 goto out_release_res; 85 goto out_release_res;
86 86
87 resource_list_for_each_entry(win, res) { 87 resource_list_for_each_entry_safe(win, tmp, res) {
88 struct resource *res = win->res; 88 struct resource *res = win->res;
89 89
90 switch (resource_type(res)) { 90 switch (resource_type(res)) {
91 case IORESOURCE_IO: 91 case IORESOURCE_IO:
92 err = pci_remap_iospace(res, iobase); 92 err = pci_remap_iospace(res, iobase);
93 if (err) 93 if (err) {
94 dev_warn(dev, "error %d: failed to map resource %pR\n", 94 dev_warn(dev, "error %d: failed to map resource %pR\n",
95 err, res); 95 err, res);
96 resource_list_destroy_entry(win);
97 }
96 break; 98 break;
97 case IORESOURCE_MEM: 99 case IORESOURCE_MEM:
98 res_valid |= !(res->flags & IORESOURCE_PREFETCH); 100 res_valid |= !(res->flags & IORESOURCE_PREFETCH);
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
index 16374202cb8b..ee64f9755ea6 100644
--- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c
@@ -435,7 +435,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
435 struct resource *cfg_res; 435 struct resource *cfg_res;
436 int i, ret; 436 int i, ret;
437 LIST_HEAD(res); 437 LIST_HEAD(res);
438 struct resource_entry *win; 438 struct resource_entry *win, *tmp;
439 439
440 cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config"); 440 cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config");
441 if (cfg_res) { 441 if (cfg_res) {
@@ -456,17 +456,20 @@ int dw_pcie_host_init(struct pcie_port *pp)
456 goto error; 456 goto error;
457 457
458 /* Get the I/O and memory ranges from DT */ 458 /* Get the I/O and memory ranges from DT */
459 resource_list_for_each_entry(win, &res) { 459 resource_list_for_each_entry_safe(win, tmp, &res) {
460 switch (resource_type(win->res)) { 460 switch (resource_type(win->res)) {
461 case IORESOURCE_IO: 461 case IORESOURCE_IO:
462 pp->io = win->res; 462 ret = pci_remap_iospace(win->res, pp->io_base);
463 pp->io->name = "I/O"; 463 if (ret) {
464 pp->io_size = resource_size(pp->io);
465 pp->io_bus_addr = pp->io->start - win->offset;
466 ret = pci_remap_iospace(pp->io, pp->io_base);
467 if (ret)
468 dev_warn(pp->dev, "error %d: failed to map resource %pR\n", 464 dev_warn(pp->dev, "error %d: failed to map resource %pR\n",
469 ret, pp->io); 465 ret, win->res);
466 resource_list_destroy_entry(win);
467 } else {
468 pp->io = win->res;
469 pp->io->name = "I/O";
470 pp->io_size = resource_size(pp->io);
471 pp->io_bus_addr = pp->io->start - win->offset;
472 }
470 break; 473 break;
471 case IORESOURCE_MEM: 474 case IORESOURCE_MEM:
472 pp->mem = win->res; 475 pp->mem = win->res;
diff --git a/drivers/pci/host/pcie-rcar.c b/drivers/pci/host/pcie-rcar.c
index 65db7a221509..5f7fcc971cae 100644
--- a/drivers/pci/host/pcie-rcar.c
+++ b/drivers/pci/host/pcie-rcar.c
@@ -945,7 +945,7 @@ static int rcar_pcie_parse_request_of_pci_ranges(struct rcar_pcie *pci)
945 struct device *dev = pci->dev; 945 struct device *dev = pci->dev;
946 struct device_node *np = dev->of_node; 946 struct device_node *np = dev->of_node;
947 resource_size_t iobase; 947 resource_size_t iobase;
948 struct resource_entry *win; 948 struct resource_entry *win, *tmp;
949 949
950 err = of_pci_get_host_bridge_resources(np, 0, 0xff, &pci->resources, &iobase); 950 err = of_pci_get_host_bridge_resources(np, 0, 0xff, &pci->resources, &iobase);
951 if (err) 951 if (err)
@@ -955,14 +955,17 @@ static int rcar_pcie_parse_request_of_pci_ranges(struct rcar_pcie *pci)
955 if (err) 955 if (err)
956 goto out_release_res; 956 goto out_release_res;
957 957
958 resource_list_for_each_entry(win, &pci->resources) { 958 resource_list_for_each_entry_safe(win, tmp, &pci->resources) {
959 struct resource *res = win->res; 959 struct resource *res = win->res;
960 960
961 if (resource_type(res) == IORESOURCE_IO) { 961 if (resource_type(res) == IORESOURCE_IO) {
962 err = pci_remap_iospace(res, iobase); 962 err = pci_remap_iospace(res, iobase);
963 if (err) 963 if (err) {
964 dev_warn(dev, "error %d: failed to map resource %pR\n", 964 dev_warn(dev, "error %d: failed to map resource %pR\n",
965 err, res); 965 err, res);
966
967 resource_list_destroy_entry(win);
968 }
966 } 969 }
967 } 970 }
968 971