Commit 31e92e0a authored by Paul Mackerras's avatar Paul Mackerras

[POWERPC] Fix incorrect calculation of I/O window addresses

My patch "Cope with PCI host bridge I/O window not starting at 0"
introduced a bug in the calculation of the virtual addresses for the
I/O windows of PCI host bridges other than the first, because it
didn't account for the fact that hose->io_resource gets offset so that
it reflects the range of global I/O port numbers assigned to the
bridge.  This fixes it and simplifies get_bus_io_range() in the
process.
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 4cc81aac
...@@ -1098,28 +1098,18 @@ static int get_bus_io_range(struct pci_bus *bus, unsigned long *start_phys, ...@@ -1098,28 +1098,18 @@ static int get_bus_io_range(struct pci_bus *bus, unsigned long *start_phys,
unsigned long *start_virt, unsigned long *size) unsigned long *start_virt, unsigned long *size)
{ {
struct pci_controller *hose = pci_bus_to_host(bus); struct pci_controller *hose = pci_bus_to_host(bus);
struct pci_bus_region region;
struct resource *res; struct resource *res;
if (bus->self) { if (bus->self)
res = bus->resource[0]; res = bus->resource[0];
pcibios_resource_to_bus(bus->self, &region, res); else
*start_phys = hose->io_base_phys + region.start;
*start_virt = (unsigned long) hose->io_base_virt +
region.start;
if (region.end > region.start)
*size = region.end - region.start + 1;
else {
printk("%s(): unexpected region 0x%lx->0x%lx\n",
__FUNCTION__, region.start, region.end);
return 1;
}
} else {
/* Root Bus */ /* Root Bus */
res = &hose->io_resource; res = &hose->io_resource;
*start_phys = hose->io_base_phys + res->start;
*start_virt = (unsigned long) hose->io_base_virt + res->start; *start_virt = pci_io_base + res->start;
*start_phys = *start_virt + hose->io_base_phys
- (unsigned long) hose->io_base_virt;
if (res->end > res->start) if (res->end > res->start)
*size = res->end - res->start + 1; *size = res->end - res->start + 1;
else { else {
...@@ -1127,7 +1117,6 @@ static int get_bus_io_range(struct pci_bus *bus, unsigned long *start_phys, ...@@ -1127,7 +1117,6 @@ static int get_bus_io_range(struct pci_bus *bus, unsigned long *start_phys,
__FUNCTION__, res->start, res->end); __FUNCTION__, res->start, res->end);
return 1; return 1;
} }
}
return 0; return 0;
} }
......
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