[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: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Родитель
4cc81aac8b
Коммит
31e92e0a1f
|
@ -1098,35 +1098,24 @@ 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, ®ion, 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;
|
||||||
if (res->end > res->start)
|
*start_phys = *start_virt + hose->io_base_phys
|
||||||
*size = res->end - res->start + 1;
|
- (unsigned long) hose->io_base_virt;
|
||||||
else {
|
|
||||||
printk("%s(): unexpected region 0x%lx->0x%lx\n",
|
if (res->end > res->start)
|
||||||
__FUNCTION__, res->start, res->end);
|
*size = res->end - res->start + 1;
|
||||||
return 1;
|
else {
|
||||||
}
|
printk("%s(): unexpected region 0x%lx->0x%lx\n",
|
||||||
|
__FUNCTION__, res->start, res->end);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче