| .. | .. |
|---|
| 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 |
|---|