|
@@ -344,26 +344,6 @@ static void pci_register_legacy_regions(struct resource *io_res,
|
|
|
p->end = p->start + 0x1ffffUL;
|
|
|
p->flags = IORESOURCE_BUSY;
|
|
|
request_resource(mem_res, p);
|
|
|
-
|
|
|
- p = kzalloc(sizeof(*p), GFP_KERNEL);
|
|
|
- if (!p)
|
|
|
- return;
|
|
|
-
|
|
|
- p->name = "System ROM";
|
|
|
- p->start = mem_res->start + 0xf0000UL;
|
|
|
- p->end = p->start + 0xffffUL;
|
|
|
- p->flags = IORESOURCE_BUSY;
|
|
|
- request_resource(mem_res, p);
|
|
|
-
|
|
|
- p = kzalloc(sizeof(*p), GFP_KERNEL);
|
|
|
- if (!p)
|
|
|
- return;
|
|
|
-
|
|
|
- p->name = "Video ROM";
|
|
|
- p->start = mem_res->start + 0xc0000UL;
|
|
|
- p->end = p->start + 0x7fffUL;
|
|
|
- p->flags = IORESOURCE_BUSY;
|
|
|
- request_resource(mem_res, p);
|
|
|
}
|
|
|
|
|
|
static void pci_register_iommu_region(struct pci_pbm_info *pbm)
|
|
@@ -397,6 +377,8 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm)
|
|
|
int i, saw_mem, saw_io;
|
|
|
int num_pbm_ranges;
|
|
|
|
|
|
+ /* Corresponding generic code in of_pci_get_host_bridge_resources() */
|
|
|
+
|
|
|
saw_mem = saw_io = 0;
|
|
|
pbm_ranges = of_get_property(pbm->op->dev.of_node, "ranges", &i);
|
|
|
if (!pbm_ranges) {
|
|
@@ -411,13 +393,16 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm)
|
|
|
|
|
|
for (i = 0; i < num_pbm_ranges; i++) {
|
|
|
const struct linux_prom_pci_ranges *pr = &pbm_ranges[i];
|
|
|
- unsigned long a, size;
|
|
|
+ unsigned long a, size, region_a;
|
|
|
u32 parent_phys_hi, parent_phys_lo;
|
|
|
+ u32 child_phys_mid, child_phys_lo;
|
|
|
u32 size_hi, size_lo;
|
|
|
int type;
|
|
|
|
|
|
parent_phys_hi = pr->parent_phys_hi;
|
|
|
parent_phys_lo = pr->parent_phys_lo;
|
|
|
+ child_phys_mid = pr->child_phys_mid;
|
|
|
+ child_phys_lo = pr->child_phys_lo;
|
|
|
if (tlb_type == hypervisor)
|
|
|
parent_phys_hi &= 0x0fffffff;
|
|
|
|
|
@@ -427,6 +412,8 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm)
|
|
|
type = (pr->child_phys_hi >> 24) & 0x3;
|
|
|
a = (((unsigned long)parent_phys_hi << 32UL) |
|
|
|
((unsigned long)parent_phys_lo << 0UL));
|
|
|
+ region_a = (((unsigned long)child_phys_mid << 32UL) |
|
|
|
+ ((unsigned long)child_phys_lo << 0UL));
|
|
|
size = (((unsigned long)size_hi << 32UL) |
|
|
|
((unsigned long)size_lo << 0UL));
|
|
|
|
|
@@ -441,6 +428,7 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm)
|
|
|
pbm->io_space.start = a;
|
|
|
pbm->io_space.end = a + size - 1UL;
|
|
|
pbm->io_space.flags = IORESOURCE_IO;
|
|
|
+ pbm->io_offset = a - region_a;
|
|
|
saw_io = 1;
|
|
|
break;
|
|
|
|
|
@@ -449,6 +437,7 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm)
|
|
|
pbm->mem_space.start = a;
|
|
|
pbm->mem_space.end = a + size - 1UL;
|
|
|
pbm->mem_space.flags = IORESOURCE_MEM;
|
|
|
+ pbm->mem_offset = a - region_a;
|
|
|
saw_mem = 1;
|
|
|
break;
|
|
|
|
|
@@ -457,6 +446,7 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm)
|
|
|
pbm->mem64_space.start = a;
|
|
|
pbm->mem64_space.end = a + size - 1UL;
|
|
|
pbm->mem64_space.flags = IORESOURCE_MEM;
|
|
|
+ pbm->mem64_offset = a - region_a;
|
|
|
saw_mem = 1;
|
|
|
break;
|
|
|
|
|
@@ -472,14 +462,22 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm)
|
|
|
prom_halt();
|
|
|
}
|
|
|
|
|
|
- printk("%s: PCI IO[%llx] MEM[%llx]",
|
|
|
- pbm->name,
|
|
|
- pbm->io_space.start,
|
|
|
- pbm->mem_space.start);
|
|
|
+ if (pbm->io_space.flags)
|
|
|
+ printk("%s: PCI IO %pR offset %llx\n",
|
|
|
+ pbm->name, &pbm->io_space, pbm->io_offset);
|
|
|
+ if (pbm->mem_space.flags)
|
|
|
+ printk("%s: PCI MEM %pR offset %llx\n",
|
|
|
+ pbm->name, &pbm->mem_space, pbm->mem_offset);
|
|
|
+ if (pbm->mem64_space.flags && pbm->mem_space.flags) {
|
|
|
+ if (pbm->mem64_space.start <= pbm->mem_space.end)
|
|
|
+ pbm->mem64_space.start = pbm->mem_space.end + 1;
|
|
|
+ if (pbm->mem64_space.start > pbm->mem64_space.end)
|
|
|
+ pbm->mem64_space.flags = 0;
|
|
|
+ }
|
|
|
+
|
|
|
if (pbm->mem64_space.flags)
|
|
|
- printk(" MEM64[%llx]",
|
|
|
- pbm->mem64_space.start);
|
|
|
- printk("\n");
|
|
|
+ printk("%s: PCI MEM64 %pR offset %llx\n",
|
|
|
+ pbm->name, &pbm->mem64_space, pbm->mem64_offset);
|
|
|
|
|
|
pbm->io_space.name = pbm->mem_space.name = pbm->name;
|
|
|
pbm->mem64_space.name = pbm->name;
|