Skip to content

Commit

Permalink
powerpc/powernv: Fix PCI resource handling
Browse files Browse the repository at this point in the history
Recent changes to the handling of PCI resources for host bridges
are breaking the PowerNV code for assigning resources on IODA.

The root of the problem is that the pci_bus attached to a host
bridge no longer has its "legacy" resource pointers populated
but only uses the newer list instead.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
  • Loading branch information
Benjamin Herrenschmidt committed Jan 25, 2012
1 parent 897e01a commit f7ea82b
Showing 1 changed file with 27 additions and 16 deletions.
43 changes: 27 additions & 16 deletions arch/powerpc/platforms/powernv/pci-ioda.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,11 +204,10 @@ static void __devinit pnv_ioda_offset_bus(struct pci_bus *bus,
pr_devel(" -> OBR %s [%x] +%016llx\n",
bus->self ? pci_name(bus->self) : "root", flags, offset);

for (i = 0; i < 2; i++) {
r = bus->resource[i];
pci_bus_for_each_resource(bus, r, i) {
if (r && (r->flags & flags)) {
bus->resource[i]->start += offset;
bus->resource[i]->end += offset;
r->start += offset;
r->end += offset;
}
}
list_for_each_entry(dev, &bus->devices, bus_list)
Expand Down Expand Up @@ -288,12 +287,17 @@ static void __devinit pnv_ioda_calc_bus(struct pci_bus *bus, unsigned int flags,
* assignment algorithm is going to be uber-trivial for now, we
* can try to be smarter later at filling out holes.
*/
start = bus->self ? 0 : bus->resource[bres]->start;

/* Don't hand out IO 0 */
if ((flags & IORESOURCE_IO) && !bus->self)
start += 0x1000;

if (bus->self) {
/* No offset for downstream bridges */
start = 0;
} else {
/* Offset from the root */
if (flags & IORESOURCE_IO)
/* Don't hand out IO 0 */
start = hose->io_resource.start + 0x1000;
else
start = hose->mem_resources[0].start;
}
while(!list_empty(&head)) {
w = list_first_entry(&head, struct resource_wrap, link);
list_del(&w->link);
Expand Down Expand Up @@ -321,13 +325,20 @@ static void __devinit pnv_ioda_calc_bus(struct pci_bus *bus, unsigned int flags,
empty:
/* Only setup P2P's, not the PHB itself */
if (bus->self) {
WARN_ON(bus->resource[bres] == NULL);
bus->resource[bres]->start = 0;
bus->resource[bres]->flags = (*size) ? flags : 0;
bus->resource[bres]->end = (*size) ? (*size - 1) : 0;
struct resource *res = bus->resource[bres];

if (WARN_ON(res == NULL))
return;

/* Clear prefetch bus resources for now */
bus->resource[2]->flags = 0;
/*
* FIXME: We should probably export and call
* pci_bridge_check_ranges() to properly re-initialize
* the PCI portion of the flags here, and to detect
* what the bridge actually supports.
*/
res->start = 0;
res->flags = (*size) ? flags : 0;
res->end = (*size) ? (*size - 1) : 0;
}

pr_devel("<- CBR %s [%x] *size=%016llx *align=%016llx\n",
Expand Down

0 comments on commit f7ea82b

Please sign in to comment.