diff options
author | Chris Metcalf <cmetcalf@tilera.com> | 2010-06-25 16:41:11 -0400 |
---|---|---|
committer | Chris Metcalf <cmetcalf@tilera.com> | 2010-07-06 13:34:01 -0400 |
commit | fb702b942bf638baa6cbbbda9f76794db62921ef (patch) | |
tree | c065b0ab61cbb80b6209c725836a6864624b3c46 /arch/tile/include/asm/irq.h | |
parent | de5d9bf6541736dc7ad264d2b5cc99bc1b2ad958 (diff) |
arch/tile: Enable more sophisticated IRQ model for 32-bit chips.
This model is based on the on-chip interrupt model used by the
TILE-Gx next-generation hardware, and interacts much more cleanly
with the Linux generic IRQ layer.
The change includes modifications to the Tilera hypervisor, which
are reflected in the hypervisor headers in arch/tile/include/arch/.
Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/tile/include/asm/irq.h')
-rw-r--r-- | arch/tile/include/asm/irq.h | 62 |
1 files changed, 56 insertions, 6 deletions
diff --git a/arch/tile/include/asm/irq.h b/arch/tile/include/asm/irq.h index 9be1f849fac9..572fd3ef1d73 100644 --- a/arch/tile/include/asm/irq.h +++ b/arch/tile/include/asm/irq.h | |||
@@ -23,15 +23,65 @@ | |||
23 | /* IRQ numbers used for linux IPIs. */ | 23 | /* IRQ numbers used for linux IPIs. */ |
24 | #define IRQ_RESCHEDULE 1 | 24 | #define IRQ_RESCHEDULE 1 |
25 | 25 | ||
26 | /* The HV interrupt state object. */ | ||
27 | DECLARE_PER_CPU(HV_IntrState, dev_intr_state); | ||
28 | |||
29 | void ack_bad_irq(unsigned int irq); | 26 | void ack_bad_irq(unsigned int irq); |
30 | 27 | ||
31 | /* | 28 | /* |
32 | * Paravirtualized drivers should call this when their init calls | 29 | * Different ways of handling interrupts. Tile interrupts are always |
33 | * discover a valid HV IRQ. | 30 | * per-cpu; there is no global interrupt controller to implement |
31 | * enable/disable. Most onboard devices can send their interrupts to | ||
32 | * many tiles at the same time, and Tile-specific drivers know how to | ||
33 | * deal with this. | ||
34 | * | ||
35 | * However, generic devices (usually PCIE based, sometimes GPIO) | ||
36 | * expect that interrupts will fire on a single core at a time and | ||
37 | * that the irq can be enabled or disabled from any core at any time. | ||
38 | * We implement this by directing such interrupts to a single core. | ||
39 | * | ||
40 | * One added wrinkle is that PCI interrupts can be either | ||
41 | * hardware-cleared (legacy interrupts) or software cleared (MSI). | ||
42 | * Other generic device systems (GPIO) are always software-cleared. | ||
43 | * | ||
44 | * The enums below are used by drivers for onboard devices, including | ||
45 | * the internals of PCI root complex and GPIO. They allow the driver | ||
46 | * to tell the generic irq code what kind of interrupt is mapped to a | ||
47 | * particular IRQ number. | ||
48 | */ | ||
49 | enum { | ||
50 | /* per-cpu interrupt; use enable/disable_percpu_irq() to mask */ | ||
51 | TILE_IRQ_PERCPU, | ||
52 | /* global interrupt, hardware responsible for clearing. */ | ||
53 | TILE_IRQ_HW_CLEAR, | ||
54 | /* global interrupt, software responsible for clearing. */ | ||
55 | TILE_IRQ_SW_CLEAR, | ||
56 | }; | ||
57 | |||
58 | |||
59 | /* | ||
60 | * Paravirtualized drivers should call this when they dynamically | ||
61 | * allocate a new IRQ or discover an IRQ that was pre-allocated by the | ||
62 | * hypervisor for use with their particular device. This gives the | ||
63 | * IRQ subsystem an opportunity to do interrupt-type-specific | ||
64 | * initialization. | ||
65 | * | ||
66 | * ISSUE: We should modify this API so that registering anything | ||
67 | * except percpu interrupts also requires providing callback methods | ||
68 | * for enabling and disabling the interrupt. This would allow the | ||
69 | * generic IRQ code to proxy enable/disable_irq() calls back into the | ||
70 | * PCI subsystem, which in turn could enable or disable the interrupt | ||
71 | * at the PCI shim. | ||
34 | */ | 72 | */ |
35 | void tile_irq_activate(unsigned int irq); | 73 | void tile_irq_activate(unsigned int irq, int tile_irq_type); |
74 | |||
75 | /* | ||
76 | * For onboard, non-PCI (e.g. TILE_IRQ_PERCPU) devices, drivers know | ||
77 | * how to use enable/disable_percpu_irq() to manage interrupts on each | ||
78 | * core. We can't use the generic enable/disable_irq() because they | ||
79 | * use a single reference count per irq, rather than per cpu per irq. | ||
80 | */ | ||
81 | void enable_percpu_irq(unsigned int irq); | ||
82 | void disable_percpu_irq(unsigned int irq); | ||
83 | |||
84 | |||
85 | void setup_irq_regs(void); | ||
36 | 86 | ||
37 | #endif /* _ASM_TILE_IRQ_H */ | 87 | #endif /* _ASM_TILE_IRQ_H */ |