Commit b3743fa4 authored by Dominik Brodowski's avatar Dominik Brodowski Committed by Linus Torvalds

[PATCH] yenta: share code with PCI core

Share code between setup-bus.c and yenta_socket.c: use the write-out code of
resources to the bridge also in yenta_socket.c, as it provides useful debug
output.  In addition, it fixes the bug that the CPU-centric resource view
might need to be transferred to the PCI-centric view: setup-bus.c does that,
while yenta-socket.c did not.
Signed-off-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 76fa82fb
...@@ -77,8 +77,7 @@ pbus_assign_resources_sorted(struct pci_bus *bus) ...@@ -77,8 +77,7 @@ pbus_assign_resources_sorted(struct pci_bus *bus)
} }
} }
static void __devinit void pci_setup_cardbus(struct pci_bus *bus)
pci_setup_cardbus(struct pci_bus *bus)
{ {
struct pci_dev *bridge = bus->self; struct pci_dev *bridge = bus->self;
struct pci_bus_region region; struct pci_bus_region region;
...@@ -130,6 +129,7 @@ pci_setup_cardbus(struct pci_bus *bus) ...@@ -130,6 +129,7 @@ pci_setup_cardbus(struct pci_bus *bus)
region.end); region.end);
} }
} }
EXPORT_SYMBOL(pci_setup_cardbus);
/* Initialize bridges with base/limit values we have collected. /* Initialize bridges with base/limit values we have collected.
PCI-to-PCI Bridge Architecture Specification rev. 1.1 (1998) PCI-to-PCI Bridge Architecture Specification rev. 1.1 (1998)
......
...@@ -667,7 +667,7 @@ static int yenta_search_res(struct yenta_socket *socket, struct resource *res, ...@@ -667,7 +667,7 @@ static int yenta_search_res(struct yenta_socket *socket, struct resource *res,
return 0; return 0;
} }
static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned type, int addr_start, int addr_end) static int yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned type, int addr_start, int addr_end)
{ {
struct resource *root, *res; struct resource *root, *res;
struct pci_bus_region region; struct pci_bus_region region;
...@@ -676,7 +676,7 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ ...@@ -676,7 +676,7 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ
res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr; res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr;
/* Already allocated? */ /* Already allocated? */
if (res->parent) if (res->parent)
return; return 0;
/* The granularity of the memory limit is 4kB, on IO it's 4 bytes */ /* The granularity of the memory limit is 4kB, on IO it's 4 bytes */
mask = ~0xfff; mask = ~0xfff;
...@@ -692,7 +692,7 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ ...@@ -692,7 +692,7 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ
pcibios_bus_to_resource(socket->dev, res, &region); pcibios_bus_to_resource(socket->dev, res, &region);
root = pci_find_parent_resource(socket->dev, res); root = pci_find_parent_resource(socket->dev, res);
if (root && (request_resource(root, res) == 0)) if (root && (request_resource(root, res) == 0))
return; return 0;
printk(KERN_INFO "yenta %s: Preassigned resource %d busy or not available, reconfiguring...\n", printk(KERN_INFO "yenta %s: Preassigned resource %d busy or not available, reconfiguring...\n",
pci_name(socket->dev), nr); pci_name(socket->dev), nr);
} }
...@@ -700,35 +700,27 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ ...@@ -700,35 +700,27 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ
if (type & IORESOURCE_IO) { if (type & IORESOURCE_IO) {
if ((yenta_search_res(socket, res, BRIDGE_IO_MAX)) || if ((yenta_search_res(socket, res, BRIDGE_IO_MAX)) ||
(yenta_search_res(socket, res, BRIDGE_IO_ACC)) || (yenta_search_res(socket, res, BRIDGE_IO_ACC)) ||
(yenta_search_res(socket, res, BRIDGE_IO_MIN))) { (yenta_search_res(socket, res, BRIDGE_IO_MIN)))
config_writel(socket, addr_start, res->start); return 1;
config_writel(socket, addr_end, res->end);
return;
}
} else { } else {
if (type & IORESOURCE_PREFETCH) { if (type & IORESOURCE_PREFETCH) {
if ((yenta_search_res(socket, res, BRIDGE_MEM_MAX)) || if ((yenta_search_res(socket, res, BRIDGE_MEM_MAX)) ||
(yenta_search_res(socket, res, BRIDGE_MEM_ACC)) || (yenta_search_res(socket, res, BRIDGE_MEM_ACC)) ||
(yenta_search_res(socket, res, BRIDGE_MEM_MIN))) { (yenta_search_res(socket, res, BRIDGE_MEM_MIN)))
config_writel(socket, addr_start, res->start); return 1;
config_writel(socket, addr_end, res->end);
return;
}
/* Approximating prefetchable by non-prefetchable */ /* Approximating prefetchable by non-prefetchable */
res->flags = IORESOURCE_MEM; res->flags = IORESOURCE_MEM;
} }
if ((yenta_search_res(socket, res, BRIDGE_MEM_MAX)) || if ((yenta_search_res(socket, res, BRIDGE_MEM_MAX)) ||
(yenta_search_res(socket, res, BRIDGE_MEM_ACC)) || (yenta_search_res(socket, res, BRIDGE_MEM_ACC)) ||
(yenta_search_res(socket, res, BRIDGE_MEM_MIN))) { (yenta_search_res(socket, res, BRIDGE_MEM_MIN)))
config_writel(socket, addr_start, res->start); return 1;
config_writel(socket, addr_end, res->end);
return;
}
} }
printk(KERN_INFO "yenta %s: no resource of type %x available, trying to continue...\n", printk(KERN_INFO "yenta %s: no resource of type %x available, trying to continue...\n",
pci_name(socket->dev), type); pci_name(socket->dev), type);
res->start = res->end = res->flags = 0; res->start = res->end = res->flags = 0;
return 0;
} }
/* /*
...@@ -736,14 +728,17 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ ...@@ -736,14 +728,17 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ
*/ */
static void yenta_allocate_resources(struct yenta_socket *socket) static void yenta_allocate_resources(struct yenta_socket *socket)
{ {
yenta_allocate_res(socket, 0, IORESOURCE_IO, int program = 0;
program += yenta_allocate_res(socket, 0, IORESOURCE_IO,
PCI_CB_IO_BASE_0, PCI_CB_IO_LIMIT_0); PCI_CB_IO_BASE_0, PCI_CB_IO_LIMIT_0);
yenta_allocate_res(socket, 1, IORESOURCE_IO, program += yenta_allocate_res(socket, 1, IORESOURCE_IO,
PCI_CB_IO_BASE_1, PCI_CB_IO_LIMIT_1); PCI_CB_IO_BASE_1, PCI_CB_IO_LIMIT_1);
yenta_allocate_res(socket, 2, IORESOURCE_MEM|IORESOURCE_PREFETCH, program += yenta_allocate_res(socket, 2, IORESOURCE_MEM|IORESOURCE_PREFETCH,
PCI_CB_MEMORY_BASE_0, PCI_CB_MEMORY_LIMIT_0); PCI_CB_MEMORY_BASE_0, PCI_CB_MEMORY_LIMIT_0);
yenta_allocate_res(socket, 3, IORESOURCE_MEM, program += yenta_allocate_res(socket, 3, IORESOURCE_MEM,
PCI_CB_MEMORY_BASE_1, PCI_CB_MEMORY_LIMIT_1); PCI_CB_MEMORY_BASE_1, PCI_CB_MEMORY_LIMIT_1);
if (program)
pci_setup_cardbus(socket->dev->subordinate);
} }
...@@ -758,7 +753,7 @@ static void yenta_free_resources(struct yenta_socket *socket) ...@@ -758,7 +753,7 @@ static void yenta_free_resources(struct yenta_socket *socket)
res = socket->dev->resource + PCI_BRIDGE_RESOURCES + i; res = socket->dev->resource + PCI_BRIDGE_RESOURCES + i;
if (res->start != 0 && res->end != 0) if (res->start != 0 && res->end != 0)
release_resource(res); release_resource(res);
res->start = res->end = 0; res->start = res->end = res->flags = 0;
} }
} }
......
...@@ -326,6 +326,7 @@ extern struct pci_dev *pci_dev_get(struct pci_dev *dev); ...@@ -326,6 +326,7 @@ extern struct pci_dev *pci_dev_get(struct pci_dev *dev);
extern void pci_dev_put(struct pci_dev *dev); extern void pci_dev_put(struct pci_dev *dev);
extern void pci_remove_bus(struct pci_bus *b); extern void pci_remove_bus(struct pci_bus *b);
extern void pci_remove_bus_device(struct pci_dev *dev); extern void pci_remove_bus_device(struct pci_dev *dev);
void pci_setup_cardbus(struct pci_bus *bus);
/* Generic PCI functions exported to card drivers */ /* Generic PCI functions exported to card drivers */
......
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