[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: Dominik Brodowski <linux@dominikbrodowski.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
76fa82fb71
commit
b3743fa444
|
@ -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)
|
||||||
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,
|
||||||
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
|
||||||
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
|
||||||
pcibios_bus_to_resource(socket->dev, res, ®ion);
|
pcibios_bus_to_resource(socket->dev, res, ®ion);
|
||||||
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
|
||||||
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
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
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);
|
||||||
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 */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue