annotate sources/patches/linux-arm-qemuirq.patch @ 1781:b27851ab2795 draft

Vo Minh Thu was surprised by toybox replacing busybox and requested I update about.html.
author Rob Landley <rob@landley.net>
date Tue, 04 Aug 2015 14:40:20 -0500
parents 1b2017d3ecf5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1635
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 Modify arm IRQ setup to work with all versions of qemu since 1.0.
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
2
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 For many years, the kernel's versatile board setup expected all devices
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 to share IRQ 27, and QEMU 1.2 helpfully emulated hardware that did that
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 (or used IRQ 59 if the IRQ controller was told to shift everything up 32
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
6 places). This wasn't what the actual hardware did, but nobody noticed for
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
7 over a decade because this reference board was long-gone and only useful
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
8 as a base for virtualization.
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
9
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 Then the kernel developers noticed that the default IRQ range could
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 (theoretically) use IRQ 0 as an actual IRQ, so they poked the "move everything
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 up 32 places" register... and got the math wrong calculating the new IRQ
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 to expect stuff on. (Because just adding 32 wouldn't be the right thing to
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
14 do, you've gotta do a multi-stage process going through three different
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 functions with a callback.)
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
16
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 When informed they'd broken qemu, they looked up old Versatile documentation
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 and realized what they'd done had never matched real hardware, and adjusted
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 it to some other random value: still getting the math wrong. Then they finally
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 fixed the wrong math, but it turns out the documentation they were using
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 didn't match what actual hardware was doing, or something. All in all they
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 changed the IRQ mapping at least _4_TIMES_ before finally unearthing an
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 actual Versatile board out of some landfill or other to test it out on.
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 Needless to say, "this breaks QEMU" was not considered a valid data point.
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
25
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
26 Meanwhile, QEMU 1.2 and earlier only supported the "everything on irq 27" mode,
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 and the next several releases supported random potluck things the kernel du
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
28 jour did, but current ones don't.
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
29
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 BUT: if you the kernel requests irq 27 from the controller as
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
31 its first action, QEMU thinks you're running an old "everying on 27" kernel
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 and triggers an emulation mode that puts everything on IRQ 27 (or 59 if
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 you flip the add 32 bit in the controller, meaning current kernels aren't
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
34 bothered by IRQ 0 being potentially used). And this runs on all the qemu
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 versions since 1.0. (Although you still don't want to use QEMU 1.3 and 1.4
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 because they had a bug in TCG that got the size of translated blocks wrong
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 causing spurious but highly intermittent segfaults...)
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
38
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
39 Note, I broke this patch out of the big arm patch after the FIFTH time
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
40 they made changes that prevented this patch from cleanly applying.
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
41
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
42 diff --git a/arch/arm/mach-versatile/pci.c b/arch/arm/mach-versatile/pci.c
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 index c97be4e..da0342d 100644
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
44 --- a/arch/arm/mach-versatile/pci.c
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 +++ b/arch/arm/mach-versatile/pci.c
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 @@ -305,7 +305,7 @@ int __init pci_versatile_setup(int nr, struct pci_sys_data *sys)
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 * real hardware behaviour and it need not be backwards
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 * compatible for us. This write is harmless on real hardware.
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 */
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 - __raw_writel(0, VERSATILE_PCI_VIRT_BASE+PCI_INTERRUPT_LINE);
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 + __raw_writel(27, VERSATILE_PCI_VIRT_BASE+PCI_INTERRUPT_LINE);
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
52
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
53 /*
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 * Do not to map Versatile FPGA PCI device into memory space
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 @@ -346,7 +346,7 @@ static int __init versatile_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 * 30 PCI0 PCI1 PCI2 PCI3
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 * 29 PCI3 PCI0 PCI1 PCI2
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 */
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 - irq = IRQ_SIC_PCI0 + ((slot + 2 + pin - 1) & 3);
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 + irq = 59;
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
61
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 return irq;
1b2017d3ecf5 Undo random arm IRQ routing breakage du jour, yet again.
Rob Landley <rob@landley.net>
parents:
diff changeset
63 }