Skip to content

Commit

Permalink
PCI: Use common resource list management code instead of private impl…
Browse files Browse the repository at this point in the history
…ementation

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>
  • Loading branch information
Jiang Liu authored and Rafael J. Wysocki committed Feb 5, 2015
1 parent 90e9782 commit 14d76b6
Show file tree
Hide file tree
Showing 9 changed files with 27 additions and 39 deletions.
5 changes: 2 additions & 3 deletions arch/arm/kernel/bios32.c
Original file line number Diff line number Diff line change
Expand Up @@ -422,17 +422,16 @@ static int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
static int pcibios_init_resources(int busnr, struct pci_sys_data *sys)
{
int ret;
struct pci_host_bridge_window *window;
struct resource_entry *window;

if (list_empty(&sys->resources)) {
pci_add_resource_offset(&sys->resources,
&iomem_resource, sys->mem_offset);
}

list_for_each_entry(window, &sys->resources, list) {
resource_list_for_each_entry(window, &sys->resources)
if (resource_type(window->res) == IORESOURCE_IO)
return 0;
}

sys->io_res.start = (busnr * SZ_64K) ? : pcibios_min_io;
sys->io_res.end = (busnr + 1) * SZ_64K - 1;
Expand Down
4 changes: 2 additions & 2 deletions arch/x86/pci/bus_numa.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ void x86_pci_root_bus_resources(int bus, struct list_head *resources)
{
struct pci_root_info *info = x86_find_pci_root_info(bus);
struct pci_root_res *root_res;
struct pci_host_bridge_window *window;
struct resource_entry *window;
bool found = false;

if (!info)
Expand All @@ -41,7 +41,7 @@ void x86_pci_root_bus_resources(int bus, struct list_head *resources)
bus);

/* already added by acpi ? */
list_for_each_entry(window, resources, list)
resource_list_for_each_entry(window, resources)
if (window->res->flags & IORESOURCE_BUS) {
found = true;
break;
Expand Down
18 changes: 6 additions & 12 deletions drivers/pci/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,16 @@
void pci_add_resource_offset(struct list_head *resources, struct resource *res,
resource_size_t offset)
{
struct pci_host_bridge_window *window;
struct resource_entry *entry;

window = kzalloc(sizeof(struct pci_host_bridge_window), GFP_KERNEL);
if (!window) {
entry = resource_list_create_entry(res, 0);
if (!entry) {
printk(KERN_ERR "PCI: can't add host bridge window %pR\n", res);
return;
}

window->res = res;
window->offset = offset;
list_add_tail(&window->list, resources);
entry->offset = offset;
resource_list_add_tail(entry, resources);
}
EXPORT_SYMBOL(pci_add_resource_offset);

Expand All @@ -42,12 +41,7 @@ EXPORT_SYMBOL(pci_add_resource);

void pci_free_resource_list(struct list_head *resources)
{
struct pci_host_bridge_window *window, *tmp;

list_for_each_entry_safe(window, tmp, resources, list) {
list_del(&window->list);
kfree(window);
}
resource_list_free(resources);
}
EXPORT_SYMBOL(pci_free_resource_list);

Expand Down
8 changes: 4 additions & 4 deletions drivers/pci/host-bridge.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *region,
struct resource *res)
{
struct pci_host_bridge *bridge = find_pci_host_bridge(bus);
struct pci_host_bridge_window *window;
struct resource_entry *window;
resource_size_t offset = 0;

list_for_each_entry(window, &bridge->windows, list) {
resource_list_for_each_entry(window, &bridge->windows) {
if (resource_contains(window->res, res)) {
offset = window->offset;
break;
Expand All @@ -60,10 +60,10 @@ void pcibios_bus_to_resource(struct pci_bus *bus, struct resource *res,
struct pci_bus_region *region)
{
struct pci_host_bridge *bridge = find_pci_host_bridge(bus);
struct pci_host_bridge_window *window;
struct resource_entry *window;
resource_size_t offset = 0;

list_for_each_entry(window, &bridge->windows, list) {
resource_list_for_each_entry(window, &bridge->windows) {
struct pci_bus_region bus_region;

if (resource_type(res) != resource_type(window->res))
Expand Down
4 changes: 2 additions & 2 deletions drivers/pci/host/pci-host-generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,14 +149,14 @@ static int gen_pci_parse_request_of_pci_ranges(struct gen_pci *pci)
struct device *dev = pci->host.dev.parent;
struct device_node *np = dev->of_node;
resource_size_t iobase;
struct pci_host_bridge_window *win;
struct resource_entry *win;

err = of_pci_get_host_bridge_resources(np, 0, 0xff, &pci->resources,
&iobase);
if (err)
return err;

list_for_each_entry(win, &pci->resources, list) {
resource_list_for_each_entry(win, &pci->resources) {
struct resource *parent, *res = win->res;

switch (resource_type(res)) {
Expand Down
4 changes: 2 additions & 2 deletions drivers/pci/host/pci-xgene.c
Original file line number Diff line number Diff line change
Expand Up @@ -401,11 +401,11 @@ static int xgene_pcie_map_ranges(struct xgene_pcie_port *port,
struct list_head *res,
resource_size_t io_base)
{
struct pci_host_bridge_window *window;
struct resource_entry *window;
struct device *dev = port->dev;
int ret;

list_for_each_entry(window, res, list) {
resource_list_for_each_entry(window, res) {
struct resource *res = window->res;
u64 restype = resource_type(res);

Expand Down
4 changes: 2 additions & 2 deletions drivers/pci/host/pcie-xilinx.c
Original file line number Diff line number Diff line change
Expand Up @@ -737,7 +737,7 @@ static int xilinx_pcie_parse_and_add_res(struct xilinx_pcie_port *port)
resource_size_t offset;
struct of_pci_range_parser parser;
struct of_pci_range range;
struct pci_host_bridge_window *win;
struct resource_entry *win;
int err = 0, mem_resno = 0;

/* Get the ranges */
Expand Down Expand Up @@ -807,7 +807,7 @@ static int xilinx_pcie_parse_and_add_res(struct xilinx_pcie_port *port)

free_resources:
release_child_resources(&iomem_resource);
list_for_each_entry(win, &port->resources, list)
resource_list_for_each_entry(win, &port->resources)
devm_kfree(dev, win->res);
pci_free_resource_list(&port->resources);

Expand Down
10 changes: 5 additions & 5 deletions drivers/pci/probe.c
Original file line number Diff line number Diff line change
Expand Up @@ -1895,7 +1895,7 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
int error;
struct pci_host_bridge *bridge;
struct pci_bus *b, *b2;
struct pci_host_bridge_window *window, *n;
struct resource_entry *window, *n;
struct resource *res;
resource_size_t offset;
char bus_addr[64];
Expand Down Expand Up @@ -1959,8 +1959,8 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
printk(KERN_INFO "PCI host bridge to bus %s\n", dev_name(&b->dev));

/* Add initial resources to the bus */
list_for_each_entry_safe(window, n, resources, list) {
list_move_tail(&window->list, &bridge->windows);
resource_list_for_each_entry_safe(window, n, resources) {
list_move_tail(&window->node, &bridge->windows);
res = window->res;
offset = window->offset;
if (res->flags & IORESOURCE_BUS)
Expand Down Expand Up @@ -2060,12 +2060,12 @@ void pci_bus_release_busn_res(struct pci_bus *b)
struct pci_bus *pci_scan_root_bus(struct device *parent, int bus,
struct pci_ops *ops, void *sysdata, struct list_head *resources)
{
struct pci_host_bridge_window *window;
struct resource_entry *window;
bool found = false;
struct pci_bus *b;
int max;

list_for_each_entry(window, resources, list)
resource_list_for_each_entry(window, resources)
if (window->res->flags & IORESOURCE_BUS) {
found = true;
break;
Expand Down
9 changes: 2 additions & 7 deletions include/linux/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <linux/atomic.h>
#include <linux/device.h>
#include <linux/io.h>
#include <linux/resource_ext.h>
#include <uapi/linux/pci.h>

#include <linux/pci_ids.h>
Expand Down Expand Up @@ -397,16 +398,10 @@ static inline int pci_channel_offline(struct pci_dev *pdev)
return (pdev->error_state != pci_channel_io_normal);
}

struct pci_host_bridge_window {
struct list_head list;
struct resource *res; /* host bridge aperture (CPU address) */
resource_size_t offset; /* bus address + offset = CPU address */
};

struct pci_host_bridge {
struct device dev;
struct pci_bus *bus; /* root bus */
struct list_head windows; /* pci_host_bridge_windows */
struct list_head windows; /* resource_entry */
void (*release_fn)(struct pci_host_bridge *);
void *release_data;
};
Expand Down

0 comments on commit 14d76b6

Please sign in to comment.