0001 ====================================
0002 System Suspend and Device Interrupts
0003 ====================================
0004
0005 Copyright (C) 2014 Intel Corp.
0006 Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
0007
0008
0009 Suspending and Resuming Device IRQs
0010 -----------------------------------
0011
0012 Device interrupt request lines (IRQs) are generally disabled during system
0013 suspend after the "late" phase of suspending devices (that is, after all of the
0014 ->prepare, ->suspend and ->suspend_late callbacks have been executed for all
0015 devices). That is done by suspend_device_irqs().
0016
0017 The rationale for doing so is that after the "late" phase of device suspend
0018 there is no legitimate reason why any interrupts from suspended devices should
0019 trigger and if any devices have not been suspended properly yet, it is better to
0020 block interrupts from them anyway. Also, in the past we had problems with
0021 interrupt handlers for shared IRQs that device drivers implementing them were
0022 not prepared for interrupts triggering after their devices had been suspended.
0023 In some cases they would attempt to access, for example, memory address spaces
0024 of suspended devices and cause unpredictable behavior to ensue as a result.
0025 Unfortunately, such problems are very difficult to debug and the introduction
0026 of suspend_device_irqs(), along with the "noirq" phase of device suspend and
0027 resume, was the only practical way to mitigate them.
0028
0029 Device IRQs are re-enabled during system resume, right before the "early" phase
0030 of resuming devices (that is, before starting to execute ->resume_early
0031 callbacks for devices). The function doing that is resume_device_irqs().
0032
0033
0034 The IRQF_NO_SUSPEND Flag
0035 ------------------------
0036
0037 There are interrupts that can legitimately trigger during the entire system
0038 suspend-resume cycle, including the "noirq" phases of suspending and resuming
0039 devices as well as during the time when nonboot CPUs are taken offline and
0040 brought back online. That applies to timer interrupts in the first place,
0041 but also to IPIs and to some other special-purpose interrupts.
0042
0043 The IRQF_NO_SUSPEND flag is used to indicate that to the IRQ subsystem when
0044 requesting a special-purpose interrupt. It causes suspend_device_irqs() to
0045 leave the corresponding IRQ enabled so as to allow the interrupt to work as
0046 expected during the suspend-resume cycle, but does not guarantee that the
0047 interrupt will wake the system from a suspended state -- for such cases it is
0048 necessary to use enable_irq_wake().
0049
0050 Note that the IRQF_NO_SUSPEND flag affects the entire IRQ and not just one
0051 user of it. Thus, if the IRQ is shared, all of the interrupt handlers installed
0052 for it will be executed as usual after suspend_device_irqs(), even if the
0053 IRQF_NO_SUSPEND flag was not passed to request_irq() (or equivalent) by some of
0054 the IRQ's users. For this reason, using IRQF_NO_SUSPEND and IRQF_SHARED at the
0055 same time should be avoided.
0056
0057
0058 System Wakeup Interrupts, enable_irq_wake() and disable_irq_wake()
0059 ------------------------------------------------------------------
0060
0061 System wakeup interrupts generally need to be configured to wake up the system
0062 from sleep states, especially if they are used for different purposes (e.g. as
0063 I/O interrupts) in the working state.
0064
0065 That may involve turning on a special signal handling logic within the platform
0066 (such as an SoC) so that signals from a given line are routed in a different way
0067 during system sleep so as to trigger a system wakeup when needed. For example,
0068 the platform may include a dedicated interrupt controller used specifically for
0069 handling system wakeup events. Then, if a given interrupt line is supposed to
0070 wake up the system from sleep sates, the corresponding input of that interrupt
0071 controller needs to be enabled to receive signals from the line in question.
0072 After wakeup, it generally is better to disable that input to prevent the
0073 dedicated controller from triggering interrupts unnecessarily.
0074
0075 The IRQ subsystem provides two helper functions to be used by device drivers for
0076 those purposes. Namely, enable_irq_wake() turns on the platform's logic for
0077 handling the given IRQ as a system wakeup interrupt line and disable_irq_wake()
0078 turns that logic off.
0079
0080 Calling enable_irq_wake() causes suspend_device_irqs() to treat the given IRQ
0081 in a special way. Namely, the IRQ remains enabled, by on the first interrupt
0082 it will be disabled, marked as pending and "suspended" so that it will be
0083 re-enabled by resume_device_irqs() during the subsequent system resume. Also
0084 the PM core is notified about the event which causes the system suspend in
0085 progress to be aborted (that doesn't have to happen immediately, but at one
0086 of the points where the suspend thread looks for pending wakeup events).
0087
0088 This way every interrupt from a wakeup interrupt source will either cause the
0089 system suspend currently in progress to be aborted or wake up the system if
0090 already suspended. However, after suspend_device_irqs() interrupt handlers are
0091 not executed for system wakeup IRQs. They are only executed for IRQF_NO_SUSPEND
0092 IRQs at that time, but those IRQs should not be configured for system wakeup
0093 using enable_irq_wake().
0094
0095
0096 Interrupts and Suspend-to-Idle
0097 ------------------------------
0098
0099 Suspend-to-idle (also known as the "freeze" sleep state) is a relatively new
0100 system sleep state that works by idling all of the processors and waiting for
0101 interrupts right after the "noirq" phase of suspending devices.
0102
0103 Of course, this means that all of the interrupts with the IRQF_NO_SUSPEND flag
0104 set will bring CPUs out of idle while in that state, but they will not cause the
0105 IRQ subsystem to trigger a system wakeup.
0106
0107 System wakeup interrupts, in turn, will trigger wakeup from suspend-to-idle in
0108 analogy with what they do in the full system suspend case. The only difference
0109 is that the wakeup from suspend-to-idle is signaled using the usual working
0110 state interrupt delivery mechanisms and doesn't require the platform to use
0111 any special interrupt handling logic for it to work.
0112
0113
0114 IRQF_NO_SUSPEND and enable_irq_wake()
0115 -------------------------------------
0116
0117 There are very few valid reasons to use both enable_irq_wake() and the
0118 IRQF_NO_SUSPEND flag on the same IRQ, and it is never valid to use both for the
0119 same device.
0120
0121 First of all, if the IRQ is not shared, the rules for handling IRQF_NO_SUSPEND
0122 interrupts (interrupt handlers are invoked after suspend_device_irqs()) are
0123 directly at odds with the rules for handling system wakeup interrupts (interrupt
0124 handlers are not invoked after suspend_device_irqs()).
0125
0126 Second, both enable_irq_wake() and IRQF_NO_SUSPEND apply to entire IRQs and not
0127 to individual interrupt handlers, so sharing an IRQ between a system wakeup
0128 interrupt source and an IRQF_NO_SUSPEND interrupt source does not generally
0129 make sense.
0130
0131 In rare cases an IRQ can be shared between a wakeup device driver and an
0132 IRQF_NO_SUSPEND user. In order for this to be safe, the wakeup device driver
0133 must be able to discern spurious IRQs from genuine wakeup events (signalling
0134 the latter to the core with pm_system_wakeup()), must use enable_irq_wake() to
0135 ensure that the IRQ will function as a wakeup source, and must request the IRQ
0136 with IRQF_COND_SUSPEND to tell the core that it meets these requirements. If
0137 these requirements are not met, it is not valid to use IRQF_COND_SUSPEND.