Mercurial > hg > aboriginal
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 |
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 } |