diff options
Diffstat (limited to 'arch/arm/mach-versatile')
-rw-r--r-- | arch/arm/mach-versatile/pci.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/arch/arm/mach-versatile/pci.c b/arch/arm/mach-versatile/pci.c index e92e5e0705bc..234740d90385 100644 --- a/arch/arm/mach-versatile/pci.c +++ b/arch/arm/mach-versatile/pci.c | |||
@@ -295,6 +295,19 @@ int __init pci_versatile_setup(int nr, struct pci_sys_data *sys) | |||
295 | __raw_writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_2); | 295 | __raw_writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_2); |
296 | 296 | ||
297 | /* | 297 | /* |
298 | * For many years the kernel and QEMU were symbiotically buggy | ||
299 | * in that they both assumed the same broken IRQ mapping. | ||
300 | * QEMU therefore attempts to auto-detect old broken kernels | ||
301 | * so that they still work on newer QEMU as they did on old | ||
302 | * QEMU. Since we now use the correct (ie matching-hardware) | ||
303 | * IRQ mapping we write a definitely different value to a | ||
304 | * PCI_INTERRUPT_LINE register to tell QEMU that we expect | ||
305 | * real hardware behaviour and it need not be backwards | ||
306 | * compatible for us. This write is harmless on real hardware. | ||
307 | */ | ||
308 | __raw_writel(0, VERSATILE_PCI_VIRT_BASE+PCI_INTERRUPT_LINE); | ||
309 | |||
310 | /* | ||
298 | * Do not to map Versatile FPGA PCI device into memory space | 311 | * Do not to map Versatile FPGA PCI device into memory space |
299 | */ | 312 | */ |
300 | pci_slot_ignore |= (1 << myslot); | 313 | pci_slot_ignore |= (1 << myslot); |
@@ -327,13 +340,13 @@ static int __init versatile_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | |||
327 | { | 340 | { |
328 | int irq; | 341 | int irq; |
329 | 342 | ||
330 | /* slot, pin, irq | 343 | /* |
331 | * 24 1 IRQ_SIC_PCI0 | 344 | * Slot INTA INTB INTC INTD |
332 | * 25 1 IRQ_SIC_PCI1 | 345 | * 31 PCI1 PCI2 PCI3 PCI0 |
333 | * 26 1 IRQ_SIC_PCI2 | 346 | * 30 PCI0 PCI1 PCI2 PCI3 |
334 | * 27 1 IRQ_SIC_PCI3 | 347 | * 29 PCI3 PCI0 PCI1 PCI2 |
335 | */ | 348 | */ |
336 | irq = IRQ_SIC_PCI0 + ((slot - 24 + pin - 1) & 3); | 349 | irq = IRQ_SIC_PCI0 + ((slot + 2 + pin - 1) & 3); |
337 | 350 | ||
338 | return irq; | 351 | return irq; |
339 | } | 352 | } |