.. | .. |
---|
61 | 61 | * interrupt handler after suspending interrupts. For system |
---|
62 | 62 | * wakeup devices users need to implement wakeup detection in |
---|
63 | 63 | * their interrupt handlers. |
---|
| 64 | + * IRQF_OOB - Interrupt is attached to an out-of-band handler living |
---|
| 65 | + * on the heading stage of the interrupt pipeline |
---|
| 66 | + * (CONFIG_IRQ_PIPELINE). It may be delivered to the |
---|
| 67 | + * handler any time interrupts are enabled in the CPU, |
---|
| 68 | + * regardless of the (virtualized) interrupt state |
---|
| 69 | + * maintained by local_irq_save/disable(). |
---|
64 | 70 | */ |
---|
65 | 71 | #define IRQF_SHARED 0x00000080 |
---|
66 | 72 | #define IRQF_PROBE_SHARED 0x00000100 |
---|
.. | .. |
---|
74 | 80 | #define IRQF_NO_THREAD 0x00010000 |
---|
75 | 81 | #define IRQF_EARLY_RESUME 0x00020000 |
---|
76 | 82 | #define IRQF_COND_SUSPEND 0x00040000 |
---|
| 83 | +#define IRQF_OOB 0x00080000 |
---|
77 | 84 | |
---|
78 | 85 | #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD) |
---|
79 | 86 | |
---|
.. | .. |
---|
514 | 521 | * to ensure that after a local_irq_disable(), interrupts have |
---|
515 | 522 | * really been disabled in hardware. Such architectures need to |
---|
516 | 523 | * implement the following hook. |
---|
| 524 | + * |
---|
| 525 | + * Those cases also apply when interrupt pipelining is in effect, |
---|
| 526 | + * since we are virtualizing the interrupt disable state here too. |
---|
517 | 527 | */ |
---|
518 | 528 | #ifndef hard_irq_disable |
---|
519 | | -#define hard_irq_disable() do { } while(0) |
---|
| 529 | +#define hard_irq_disable() hard_cond_local_irq_disable() |
---|
| 530 | +#endif |
---|
| 531 | + |
---|
| 532 | +/* |
---|
| 533 | + * Unlike other virtualized interrupt disabling schemes may assume, we |
---|
| 534 | + * can't expect local_irq_restore() to turn hard interrupts on when |
---|
| 535 | + * pipelining. hard_irq_enable() is introduced to be paired with |
---|
| 536 | + * hard_irq_disable(), for unconditionally turning them on. The only |
---|
| 537 | + * sane sequence mixing virtual and real disable state manipulation |
---|
| 538 | + * is: |
---|
| 539 | + * |
---|
| 540 | + * 1. local_irq_save/disable |
---|
| 541 | + * 2. hard_irq_disable |
---|
| 542 | + * 3. hard_irq_enable |
---|
| 543 | + * 4. local_irq_restore/enable |
---|
| 544 | + */ |
---|
| 545 | +#ifndef hard_irq_enable |
---|
| 546 | +#define hard_irq_enable() hard_cond_local_irq_enable() |
---|
520 | 547 | #endif |
---|
521 | 548 | |
---|
522 | 549 | /* PLEASE, avoid to allocate new softirqs, if you need not _really_ high |
---|