diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2016-10-03 10:43:19 -0400 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2016-10-03 10:43:19 -0400 |
commit | fb6b6cc41bed72cbafb0d01ab139a4a5ad673e01 (patch) | |
tree | a5af55477a61f7f5c7e507547fefafb0af8cdcf3 /drivers/pci/host | |
parent | 4dc2db096a9f7c0316bafc18ee00d89e0acf4ebf (diff) | |
parent | 13f392ebc37e31568fae72a73ee378ae22a9740f (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.c | 8 | ||||
-rw-r--r-- | drivers/pci/host/pci-host-common.c | 8 | ||||
-rw-r--r-- | drivers/pci/host/pci-tegra.c | 7 | ||||
-rw-r--r-- | drivers/pci/host/pci-versatile.c | 8 | ||||
-rw-r--r-- | drivers/pci/host/pcie-designware.c | 21 | ||||
-rw-r--r-- | drivers/pci/host/pcie-rcar.c | 9 |
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 | ||