diff options
| author | Paul Mundt <lethal@linux-sh.org> | 2009-02-12 03:27:56 -0500 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2009-02-12 03:27:56 -0500 |
| commit | 41480ae7a383dcffa497decdd97b3cb2caaa18ec (patch) | |
| tree | f1e3afce2cbd0bbc544cd86a73e5b3093eb081c4 /arch/powerpc/kernel/pci-common.c | |
| parent | 508eb2ce222053e51e2243b7add8eeac85b1d250 (diff) | |
| parent | 34aeb43e2d3800f4d8f96feb9f1b49cd506679d5 (diff) | |
Merge branch 'sh/stable-updates'
Diffstat (limited to 'arch/powerpc/kernel/pci-common.c')
| -rw-r--r-- | arch/powerpc/kernel/pci-common.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index da5a3855a0c4..0f4181272311 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
| @@ -16,8 +16,6 @@ | |||
| 16 | * 2 of the License, or (at your option) any later version. | 16 | * 2 of the License, or (at your option) any later version. |
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | #define DEBUG | ||
| 20 | |||
| 21 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
| 22 | #include <linux/pci.h> | 20 | #include <linux/pci.h> |
| 23 | #include <linux/string.h> | 21 | #include <linux/string.h> |
| @@ -258,7 +256,8 @@ int pci_read_irq_line(struct pci_dev *pci_dev) | |||
| 258 | } else { | 256 | } else { |
| 259 | pr_debug(" Got one, spec %d cells (0x%08x 0x%08x...) on %s\n", | 257 | pr_debug(" Got one, spec %d cells (0x%08x 0x%08x...) on %s\n", |
| 260 | oirq.size, oirq.specifier[0], oirq.specifier[1], | 258 | oirq.size, oirq.specifier[0], oirq.specifier[1], |
| 261 | oirq.controller->full_name); | 259 | oirq.controller ? oirq.controller->full_name : |
| 260 | "<default>"); | ||
| 262 | 261 | ||
| 263 | virq = irq_create_of_mapping(oirq.controller, oirq.specifier, | 262 | virq = irq_create_of_mapping(oirq.controller, oirq.specifier, |
| 264 | oirq.size); | 263 | oirq.size); |
| @@ -562,8 +561,21 @@ int pci_mmap_legacy_page_range(struct pci_bus *bus, | |||
| 562 | (unsigned long long)(offset + size - 1)); | 561 | (unsigned long long)(offset + size - 1)); |
| 563 | 562 | ||
| 564 | if (mmap_state == pci_mmap_mem) { | 563 | if (mmap_state == pci_mmap_mem) { |
| 565 | if ((offset + size) > hose->isa_mem_size) | 564 | /* Hack alert ! |
| 566 | return -ENXIO; | 565 | * |
| 566 | * Because X is lame and can fail starting if it gets an error trying | ||
| 567 | * to mmap legacy_mem (instead of just moving on without legacy memory | ||
| 568 | * access) we fake it here by giving it anonymous memory, effectively | ||
| 569 | * behaving just like /dev/zero | ||
| 570 | */ | ||
| 571 | if ((offset + size) > hose->isa_mem_size) { | ||
| 572 | printk(KERN_DEBUG | ||
| 573 | "Process %s (pid:%d) mapped non-existing PCI legacy memory for 0%04x:%02x\n", | ||
| 574 | current->comm, current->pid, pci_domain_nr(bus), bus->number); | ||
| 575 | if (vma->vm_flags & VM_SHARED) | ||
| 576 | return shmem_zero_setup(vma); | ||
| 577 | return 0; | ||
| 578 | } | ||
| 567 | offset += hose->isa_mem_phys; | 579 | offset += hose->isa_mem_phys; |
| 568 | } else { | 580 | } else { |
| 569 | unsigned long io_offset = (unsigned long)hose->io_base_virt - _IO_BASE; | 581 | unsigned long io_offset = (unsigned long)hose->io_base_virt - _IO_BASE; |
