aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/ia64')
-rw-r--r--arch/ia64/sn/kernel/io_acpi_init.c17
-rw-r--r--arch/ia64/sn/kernel/io_init.c20
2 files changed, 25 insertions, 12 deletions
diff --git a/arch/ia64/sn/kernel/io_acpi_init.c b/arch/ia64/sn/kernel/io_acpi_init.c
index c6216f454ffb..3c7178f5dce8 100644
--- a/arch/ia64/sn/kernel/io_acpi_init.c
+++ b/arch/ia64/sn/kernel/io_acpi_init.c
@@ -418,7 +418,7 @@ sn_acpi_slot_fixup(struct pci_dev *dev)
418 void __iomem *addr; 418 void __iomem *addr;
419 struct pcidev_info *pcidev_info = NULL; 419 struct pcidev_info *pcidev_info = NULL;
420 struct sn_irq_info *sn_irq_info = NULL; 420 struct sn_irq_info *sn_irq_info = NULL;
421 size_t size; 421 size_t image_size, size;
422 422
423 if (sn_acpi_get_pcidev_info(dev, &pcidev_info, &sn_irq_info)) { 423 if (sn_acpi_get_pcidev_info(dev, &pcidev_info, &sn_irq_info)) {
424 panic("%s: Failure obtaining pcidev_info for %s\n", 424 panic("%s: Failure obtaining pcidev_info for %s\n",
@@ -428,17 +428,16 @@ sn_acpi_slot_fixup(struct pci_dev *dev)
428 if (pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE]) { 428 if (pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE]) {
429 /* 429 /*
430 * A valid ROM image exists and has been shadowed by the 430 * A valid ROM image exists and has been shadowed by the
431 * PROM. Setup the pci_dev ROM resource to point to 431 * PROM. Setup the pci_dev ROM resource with the address
432 * the shadowed copy. 432 * of the shadowed copy, and the actual length of the ROM image.
433 */ 433 */
434 size = dev->resource[PCI_ROM_RESOURCE].end - 434 size = pci_resource_len(dev, PCI_ROM_RESOURCE);
435 dev->resource[PCI_ROM_RESOURCE].start; 435 addr = ioremap(pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE],
436 addr = 436 size);
437 ioremap(pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE], 437 image_size = pci_get_rom_size(addr, size);
438 size);
439 dev->resource[PCI_ROM_RESOURCE].start = (unsigned long) addr; 438 dev->resource[PCI_ROM_RESOURCE].start = (unsigned long) addr;
440 dev->resource[PCI_ROM_RESOURCE].end = 439 dev->resource[PCI_ROM_RESOURCE].end =
441 (unsigned long) addr + size; 440 (unsigned long) addr + image_size - 1;
442 dev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_BIOS_COPY; 441 dev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_BIOS_COPY;
443 } 442 }
444 sn_pci_fixup_slot(dev, pcidev_info, sn_irq_info); 443 sn_pci_fixup_slot(dev, pcidev_info, sn_irq_info);
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c
index 6b10e5d28488..906b93674b76 100644
--- a/arch/ia64/sn/kernel/io_init.c
+++ b/arch/ia64/sn/kernel/io_init.c
@@ -259,9 +259,23 @@ sn_io_slot_fixup(struct pci_dev *dev)
259 insert_resource(&ioport_resource, &dev->resource[idx]); 259 insert_resource(&ioport_resource, &dev->resource[idx]);
260 else 260 else
261 insert_resource(&iomem_resource, &dev->resource[idx]); 261 insert_resource(&iomem_resource, &dev->resource[idx]);
262 /* If ROM, mark as shadowed in PROM */ 262 /*
263 if (idx == PCI_ROM_RESOURCE) 263 * If ROM, set the actual ROM image size, and mark as
264 dev->resource[idx].flags |= IORESOURCE_ROM_BIOS_COPY; 264 * shadowed in PROM.
265 */
266 if (idx == PCI_ROM_RESOURCE) {
267 size_t image_size;
268 void __iomem *rom;
269
270 rom = ioremap(pci_resource_start(dev, PCI_ROM_RESOURCE),
271 size + 1);
272 image_size = pci_get_rom_size(rom, size + 1);
273 dev->resource[PCI_ROM_RESOURCE].end =
274 dev->resource[PCI_ROM_RESOURCE].start +
275 image_size - 1;
276 dev->resource[PCI_ROM_RESOURCE].flags |=
277 IORESOURCE_ROM_BIOS_COPY;
278 }
265 } 279 }
266 /* Create a pci_window in the pci_controller struct for 280 /* Create a pci_window in the pci_controller struct for
267 * each device resource. 281 * each device resource.