diff options
| author | Jiang Liu <jiang.liu@linux.intel.com> | 2015-02-05 00:44:44 -0500 |
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-02-05 09:09:25 -0500 |
| commit | 14d76b68f2819a1d0b50236a7e9e9f2ea69869d9 (patch) | |
| tree | 5ffb753937e5e2f951404acd666e78d4e591298c | |
| parent | 90e97820619dc912b52cc9d103272819d8b51259 (diff) | |
PCI: Use common resource list management code instead of private implementation
Use common resource list management data structure and interfaces
instead of private implementation.
Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
Acked-by: Will Deacon <will.deacon@arm.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
| -rw-r--r-- | arch/arm/kernel/bios32.c | 5 | ||||
| -rw-r--r-- | arch/x86/pci/bus_numa.c | 4 | ||||
| -rw-r--r-- | drivers/pci/bus.c | 18 | ||||
| -rw-r--r-- | drivers/pci/host-bridge.c | 8 | ||||
| -rw-r--r-- | drivers/pci/host/pci-host-generic.c | 4 | ||||
| -rw-r--r-- | drivers/pci/host/pci-xgene.c | 4 | ||||
| -rw-r--r-- | drivers/pci/host/pcie-xilinx.c | 4 | ||||
| -rw-r--r-- | drivers/pci/probe.c | 10 | ||||
| -rw-r--r-- | include/linux/pci.h | 9 |
9 files changed, 27 insertions, 39 deletions
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index a4effd6d8f2f..016991792b0b 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c | |||
| @@ -422,17 +422,16 @@ static int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | |||
| 422 | static int pcibios_init_resources(int busnr, struct pci_sys_data *sys) | 422 | static int pcibios_init_resources(int busnr, struct pci_sys_data *sys) |
| 423 | { | 423 | { |
| 424 | int ret; | 424 | int ret; |
| 425 | struct pci_host_bridge_window *window; | 425 | struct resource_entry *window; |
| 426 | 426 | ||
| 427 | if (list_empty(&sys->resources)) { | 427 | if (list_empty(&sys->resources)) { |
| 428 | pci_add_resource_offset(&sys->resources, | 428 | pci_add_resource_offset(&sys->resources, |
| 429 | &iomem_resource, sys->mem_offset); | 429 | &iomem_resource, sys->mem_offset); |
| 430 | } | 430 | } |
| 431 | 431 | ||
| 432 | list_for_each_entry(window, &sys->resources, list) { | 432 | resource_list_for_each_entry(window, &sys->resources) |
| 433 | if (resource_type(window->res) == IORESOURCE_IO) | 433 | if (resource_type(window->res) == IORESOURCE_IO) |
| 434 | return 0; | 434 | return 0; |
| 435 | } | ||
| 436 | 435 | ||
| 437 | sys->io_res.start = (busnr * SZ_64K) ? : pcibios_min_io; | 436 | sys->io_res.start = (busnr * SZ_64K) ? : pcibios_min_io; |
| 438 | sys->io_res.end = (busnr + 1) * SZ_64K - 1; | 437 | sys->io_res.end = (busnr + 1) * SZ_64K - 1; |
diff --git a/arch/x86/pci/bus_numa.c b/arch/x86/pci/bus_numa.c index f3a2cfc14125..7bcf06a7cd12 100644 --- a/arch/x86/pci/bus_numa.c +++ b/arch/x86/pci/bus_numa.c | |||
| @@ -31,7 +31,7 @@ void x86_pci_root_bus_resources(int bus, struct list_head *resources) | |||
| 31 | { | 31 | { |
| 32 | struct pci_root_info *info = x86_find_pci_root_info(bus); | 32 | struct pci_root_info *info = x86_find_pci_root_info(bus); |
| 33 | struct pci_root_res *root_res; | 33 | struct pci_root_res *root_res; |
| 34 | struct pci_host_bridge_window *window; | 34 | struct resource_entry *window; |
| 35 | bool found = false; | 35 | bool found = false; |
| 36 | 36 | ||
| 37 | if (!info) | 37 | if (!info) |
| @@ -41,7 +41,7 @@ void x86_pci_root_bus_resources(int bus, struct list_head *resources) | |||
| 41 | bus); | 41 | bus); |
| 42 | 42 | ||
| 43 | /* already added by acpi ? */ | 43 | /* already added by acpi ? */ |
| 44 | list_for_each_entry(window, resources, list) | 44 | resource_list_for_each_entry(window, resources) |
| 45 | if (window->res->flags & IORESOURCE_BUS) { | 45 | if (window->res->flags & IORESOURCE_BUS) { |
| 46 | found = true; | 46 | found = true; |
| 47 | break; | 47 | break; |
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index 8fb16188cd82..90fa3a78fb7c 100644 --- a/drivers/pci/bus.c +++ b/drivers/pci/bus.c | |||
| @@ -20,17 +20,16 @@ | |||
| 20 | void pci_add_resource_offset(struct list_head *resources, struct resource *res, | 20 | void pci_add_resource_offset(struct list_head *resources, struct resource *res, |
| 21 | resource_size_t offset) | 21 | resource_size_t offset) |
| 22 | { | 22 | { |
| 23 | struct pci_host_bridge_window *window; | 23 | struct resource_entry *entry; |
| 24 | 24 | ||
| 25 | window = kzalloc(sizeof(struct pci_host_bridge_window), GFP_KERNEL); | 25 | entry = resource_list_create_entry(res, 0); |
| 26 | if (!window) { | 26 | if (!entry) { |
| 27 | printk(KERN_ERR "PCI: can't add host bridge window %pR\n", res); | 27 | printk(KERN_ERR "PCI: can't add host bridge window %pR\n", res); |
| 28 | return; | 28 | return; |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | window->res = res; | 31 | entry->offset = offset; |
| 32 | window->offset = offset; | 32 | resource_list_add_tail(entry, resources); |
| 33 | list_add_tail(&window->list, resources); | ||
| 34 | } | 33 | } |
| 35 | EXPORT_SYMBOL(pci_add_resource_offset); | 34 | EXPORT_SYMBOL(pci_add_resource_offset); |
| 36 | 35 | ||
| @@ -42,12 +41,7 @@ EXPORT_SYMBOL(pci_add_resource); | |||
| 42 | 41 | ||
| 43 | void pci_free_resource_list(struct list_head *resources) | 42 | void pci_free_resource_list(struct list_head *resources) |
| 44 | { | 43 | { |
| 45 | struct pci_host_bridge_window *window, *tmp; | 44 | resource_list_free(resources); |
| 46 | |||
| 47 | list_for_each_entry_safe(window, tmp, resources, list) { | ||
| 48 | list_del(&window->list); | ||
| 49 | kfree(window); | ||
| 50 | } | ||
| 51 | } | 45 | } |
| 52 | EXPORT_SYMBOL(pci_free_resource_list); | 46 | EXPORT_SYMBOL(pci_free_resource_list); |
| 53 | 47 | ||
diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c index 0e5f3c95af5b..39b2dbe585aa 100644 --- a/drivers/pci/host-bridge.c +++ b/drivers/pci/host-bridge.c | |||
| @@ -35,10 +35,10 @@ void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *region, | |||
| 35 | struct resource *res) | 35 | struct resource *res) |
| 36 | { | 36 | { |
| 37 | struct pci_host_bridge *bridge = find_pci_host_bridge(bus); | 37 | struct pci_host_bridge *bridge = find_pci_host_bridge(bus); |
| 38 | struct pci_host_bridge_window *window; | 38 | struct resource_entry *window; |
| 39 | resource_size_t offset = 0; | 39 | resource_size_t offset = 0; |
| 40 | 40 | ||
| 41 | list_for_each_entry(window, &bridge->windows, list) { | 41 | resource_list_for_each_entry(window, &bridge->windows) { |
| 42 | if (resource_contains(window->res, res)) { | 42 | if (resource_contains(window->res, res)) { |
| 43 | offset = window->offset; | 43 | offset = window->offset; |
| 44 | break; | 44 | break; |
| @@ -60,10 +60,10 @@ void pcibios_bus_to_resource(struct pci_bus *bus, struct resource *res, | |||
| 60 | struct pci_bus_region *region) | 60 | struct pci_bus_region *region) |
| 61 | { | 61 | { |
| 62 | struct pci_host_bridge *bridge = find_pci_host_bridge(bus); | 62 | struct pci_host_bridge *bridge = find_pci_host_bridge(bus); |
| 63 | struct pci_host_bridge_window *window; | 63 | struct resource_entry *window; |
| 64 | resource_size_t offset = 0; | 64 | resource_size_t offset = 0; |
| 65 | 65 | ||
| 66 | list_for_each_entry(window, &bridge->windows, list) { | 66 | resource_list_for_each_entry(window, &bridge->windows) { |
| 67 | struct pci_bus_region bus_region; | 67 | struct pci_bus_region bus_region; |
| 68 | 68 | ||
| 69 | if (resource_type(res) != resource_type(window->res)) | 69 | if (resource_type(res) != resource_type(window->res)) |
diff --git a/drivers/pci/host/pci-host-generic.c b/drivers/pci/host/pci-host-generic.c index 6eb1aa75bd37..aee3c620ecf9 100644 --- a/drivers/pci/host/pci-host-generic.c +++ b/drivers/pci/host/pci-host-generic.c | |||
| @@ -149,14 +149,14 @@ static int gen_pci_parse_request_of_pci_ranges(struct gen_pci *pci) | |||
| 149 | struct device *dev = pci->host.dev.parent; | 149 | struct device *dev = pci->host.dev.parent; |
| 150 | struct device_node *np = dev->of_node; | 150 | struct device_node *np = dev->of_node; |
| 151 | resource_size_t iobase; | 151 | resource_size_t iobase; |
| 152 | struct pci_host_bridge_window *win; | 152 | struct resource_entry *win; |
| 153 | 153 | ||
| 154 | err = of_pci_get_host_bridge_resources(np, 0, 0xff, &pci->resources, | 154 | err = of_pci_get_host_bridge_resources(np, 0, 0xff, &pci->resources, |
| 155 | &iobase); | 155 | &iobase); |
| 156 | if (err) | 156 | if (err) |
| 157 | return err; | 157 | return err; |
| 158 | 158 | ||
| 159 | list_for_each_entry(win, &pci->resources, list) { | 159 | resource_list_for_each_entry(win, &pci->resources) { |
| 160 | struct resource *parent, *res = win->res; | 160 | struct resource *parent, *res = win->res; |
| 161 | 161 | ||
| 162 | switch (resource_type(res)) { | 162 | switch (resource_type(res)) { |
diff --git a/drivers/pci/host/pci-xgene.c b/drivers/pci/host/pci-xgene.c index b1d0596457c5..a704257bab7f 100644 --- a/drivers/pci/host/pci-xgene.c +++ b/drivers/pci/host/pci-xgene.c | |||
| @@ -401,11 +401,11 @@ static int xgene_pcie_map_ranges(struct xgene_pcie_port *port, | |||
| 401 | struct list_head *res, | 401 | struct list_head *res, |
| 402 | resource_size_t io_base) | 402 | resource_size_t io_base) |
| 403 | { | 403 | { |
| 404 | struct pci_host_bridge_window *window; | 404 | struct resource_entry *window; |
| 405 | struct device *dev = port->dev; | 405 | struct device *dev = port->dev; |
| 406 | int ret; | 406 | int ret; |
| 407 | 407 | ||
| 408 | list_for_each_entry(window, res, list) { | 408 | resource_list_for_each_entry(window, res) { |
| 409 | struct resource *res = window->res; | 409 | struct resource *res = window->res; |
| 410 | u64 restype = resource_type(res); | 410 | u64 restype = resource_type(res); |
| 411 | 411 | ||
diff --git a/drivers/pci/host/pcie-xilinx.c b/drivers/pci/host/pcie-xilinx.c index ef3ebaf9a738..601261df7663 100644 --- a/drivers/pci/host/pcie-xilinx.c +++ b/drivers/pci/host/pcie-xilinx.c | |||
| @@ -737,7 +737,7 @@ static int xilinx_pcie_parse_and_add_res(struct xilinx_pcie_port *port) | |||
| 737 | resource_size_t offset; | 737 | resource_size_t offset; |
| 738 | struct of_pci_range_parser parser; | 738 | struct of_pci_range_parser parser; |
| 739 | struct of_pci_range range; | 739 | struct of_pci_range range; |
| 740 | struct pci_host_bridge_window *win; | 740 | struct resource_entry *win; |
| 741 | int err = 0, mem_resno = 0; | 741 | int err = 0, mem_resno = 0; |
| 742 | 742 | ||
| 743 | /* Get the ranges */ | 743 | /* Get the ranges */ |
| @@ -807,7 +807,7 @@ static int xilinx_pcie_parse_and_add_res(struct xilinx_pcie_port *port) | |||
| 807 | 807 | ||
| 808 | free_resources: | 808 | free_resources: |
| 809 | release_child_resources(&iomem_resource); | 809 | release_child_resources(&iomem_resource); |
| 810 | list_for_each_entry(win, &port->resources, list) | 810 | resource_list_for_each_entry(win, &port->resources) |
| 811 | devm_kfree(dev, win->res); | 811 | devm_kfree(dev, win->res); |
| 812 | pci_free_resource_list(&port->resources); | 812 | pci_free_resource_list(&port->resources); |
| 813 | 813 | ||
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 23212f8ae09b..8d2f400e96cb 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
| @@ -1895,7 +1895,7 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus, | |||
| 1895 | int error; | 1895 | int error; |
| 1896 | struct pci_host_bridge *bridge; | 1896 | struct pci_host_bridge *bridge; |
| 1897 | struct pci_bus *b, *b2; | 1897 | struct pci_bus *b, *b2; |
| 1898 | struct pci_host_bridge_window *window, *n; | 1898 | struct resource_entry *window, *n; |
| 1899 | struct resource *res; | 1899 | struct resource *res; |
| 1900 | resource_size_t offset; | 1900 | resource_size_t offset; |
| 1901 | char bus_addr[64]; | 1901 | char bus_addr[64]; |
| @@ -1959,8 +1959,8 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus, | |||
| 1959 | printk(KERN_INFO "PCI host bridge to bus %s\n", dev_name(&b->dev)); | 1959 | printk(KERN_INFO "PCI host bridge to bus %s\n", dev_name(&b->dev)); |
| 1960 | 1960 | ||
| 1961 | /* Add initial resources to the bus */ | 1961 | /* Add initial resources to the bus */ |
| 1962 | list_for_each_entry_safe(window, n, resources, list) { | 1962 | resource_list_for_each_entry_safe(window, n, resources) { |
| 1963 | list_move_tail(&window->list, &bridge->windows); | 1963 | list_move_tail(&window->node, &bridge->windows); |
| 1964 | res = window->res; | 1964 | res = window->res; |
| 1965 | offset = window->offset; | 1965 | offset = window->offset; |
| 1966 | if (res->flags & IORESOURCE_BUS) | 1966 | if (res->flags & IORESOURCE_BUS) |
| @@ -2060,12 +2060,12 @@ void pci_bus_release_busn_res(struct pci_bus *b) | |||
| 2060 | struct pci_bus *pci_scan_root_bus(struct device *parent, int bus, | 2060 | struct pci_bus *pci_scan_root_bus(struct device *parent, int bus, |
| 2061 | struct pci_ops *ops, void *sysdata, struct list_head *resources) | 2061 | struct pci_ops *ops, void *sysdata, struct list_head *resources) |
| 2062 | { | 2062 | { |
| 2063 | struct pci_host_bridge_window *window; | 2063 | struct resource_entry *window; |
| 2064 | bool found = false; | 2064 | bool found = false; |
| 2065 | struct pci_bus *b; | 2065 | struct pci_bus *b; |
| 2066 | int max; | 2066 | int max; |
| 2067 | 2067 | ||
| 2068 | list_for_each_entry(window, resources, list) | 2068 | resource_list_for_each_entry(window, resources) |
| 2069 | if (window->res->flags & IORESOURCE_BUS) { | 2069 | if (window->res->flags & IORESOURCE_BUS) { |
| 2070 | found = true; | 2070 | found = true; |
| 2071 | break; | 2071 | break; |
diff --git a/include/linux/pci.h b/include/linux/pci.h index 9603094ed59b..faa60fa26314 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <linux/atomic.h> | 29 | #include <linux/atomic.h> |
| 30 | #include <linux/device.h> | 30 | #include <linux/device.h> |
| 31 | #include <linux/io.h> | 31 | #include <linux/io.h> |
| 32 | #include <linux/resource_ext.h> | ||
| 32 | #include <uapi/linux/pci.h> | 33 | #include <uapi/linux/pci.h> |
| 33 | 34 | ||
| 34 | #include <linux/pci_ids.h> | 35 | #include <linux/pci_ids.h> |
| @@ -397,16 +398,10 @@ static inline int pci_channel_offline(struct pci_dev *pdev) | |||
| 397 | return (pdev->error_state != pci_channel_io_normal); | 398 | return (pdev->error_state != pci_channel_io_normal); |
| 398 | } | 399 | } |
| 399 | 400 | ||
| 400 | struct pci_host_bridge_window { | ||
| 401 | struct list_head list; | ||
| 402 | struct resource *res; /* host bridge aperture (CPU address) */ | ||
| 403 | resource_size_t offset; /* bus address + offset = CPU address */ | ||
| 404 | }; | ||
| 405 | |||
| 406 | struct pci_host_bridge { | 401 | struct pci_host_bridge { |
| 407 | struct device dev; | 402 | struct device dev; |
| 408 | struct pci_bus *bus; /* root bus */ | 403 | struct pci_bus *bus; /* root bus */ |
| 409 | struct list_head windows; /* pci_host_bridge_windows */ | 404 | struct list_head windows; /* resource_entry */ |
| 410 | void (*release_fn)(struct pci_host_bridge *); | 405 | void (*release_fn)(struct pci_host_bridge *); |
| 411 | void *release_data; | 406 | void *release_data; |
| 412 | }; | 407 | }; |
