|
@@ -294,6 +294,19 @@ int __init pci_versatile_setup(int nr, struct pci_sys_data *sys)
|
|
|
__raw_writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_1);
|
|
|
__raw_writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_2);
|
|
|
|
|
|
+ /*
|
|
|
+ * For many years the kernel and QEMU were symbiotically buggy
|
|
|
+ * in that they both assumed the same broken IRQ mapping.
|
|
|
+ * QEMU therefore attempts to auto-detect old broken kernels
|
|
|
+ * so that they still work on newer QEMU as they did on old
|
|
|
+ * QEMU. Since we now use the correct (ie matching-hardware)
|
|
|
+ * IRQ mapping we write a definitely different value to a
|
|
|
+ * PCI_INTERRUPT_LINE register to tell QEMU that we expect
|
|
|
+ * real hardware behaviour and it need not be backwards
|
|
|
+ * compatible for us. This write is harmless on real hardware.
|
|
|
+ */
|
|
|
+ __raw_writel(0, VERSATILE_PCI_VIRT_BASE+PCI_INTERRUPT_LINE);
|
|
|
+
|
|
|
/*
|
|
|
* Do not to map Versatile FPGA PCI device into memory space
|
|
|
*/
|
|
@@ -327,13 +340,13 @@ static int __init versatile_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
|
|
{
|
|
|
int irq;
|
|
|
|
|
|
- /* slot, pin, irq
|
|
|
- * 24 1 IRQ_SIC_PCI0
|
|
|
- * 25 1 IRQ_SIC_PCI1
|
|
|
- * 26 1 IRQ_SIC_PCI2
|
|
|
- * 27 1 IRQ_SIC_PCI3
|
|
|
+ /*
|
|
|
+ * Slot INTA INTB INTC INTD
|
|
|
+ * 31 PCI1 PCI2 PCI3 PCI0
|
|
|
+ * 30 PCI0 PCI1 PCI2 PCI3
|
|
|
+ * 29 PCI3 PCI0 PCI1 PCI2
|
|
|
*/
|
|
|
- irq = IRQ_SIC_PCI0 + ((slot - 24 + pin - 1) & 3);
|
|
|
+ irq = IRQ_SIC_PCI0 + ((slot + 2 + pin - 1) & 3);
|
|
|
|
|
|
return irq;
|
|
|
}
|