Re: questions of cpuidle
From: Daniel Lezcano
Date: Mon Dec 09 2013 - 09:17:20 EST
On 12/09/2013 02:40 PM, Alex Shi wrote:
Sorry for a idiot of cpuidle.
I just find few cpu set TIMER_STOP on cpuidle, like omap4 and big.Little
driver. Does that mean other ARM cpu or x86 cpu can get the timer
interrupt in cpuidle?
If the timer stopped during cpuidle, does that means at least one cpu
cann't get into deep c-state since system need a cpu to wake up other
deep c-state cpu? Or sth I missed?
If the cpu stopped the interrupt during deep c-state and without
monitor/mwait support, which kind of ipi can wake the cpu? I mean like a
x86 cpu, APIC stopped in c3 mode, but actually ipi send via apic bus. So
I don't know which ipi work?
Hi Alex,
there are several timers on the system, the local and the external. On
ARM we find the local timers twd. Depending on the depth of the idle
state, they can be shutdown.
All the cpus can go to a deep idle state because the timer expiration
will be delegated to a timer which does not belong to the power domain
of the idle state.
The idle state contains the flag TIMER_STOP when the idle state power
downs the local timer.
The cpuidle common framework checks this flag when entering the idle
state and calls clock_events_notify(ENTER/EXIT). That tells the time
framework to switch to another timer on the system in replacement of the
local one.
The external timer will be programmed to the next event and will store
the cpu which is concerned by this expiration. This timer is called the
broadcast timer.
When the broadcast timer expires there are two cases:
* if the timer has the CLOCK_EVT_FEAT_DYNIRQ set, when the time
framework switched to this timer as described above, it also set the irq
affinity to the cpu. So no IPI happens because the interrupt occurs
directly to the targeted cpu
* if the timer has *no* CLOCK_EVT_FEAT_DYNIRQ set, then the interrupt
will occur to any cpus belonging to the cpumask (usually cpu0), and if
the timer must expires for another cpu then an IPI is emitted to the
cpu. The IPI is the IPI_TIMER.
Concerning the wake up of the cpu: the cpu disabled the irq and goes to
sleep, it is up to the firmware to wake up the cpu when an interrupt
occurs. It will exits its sleep state, call clock_events_notify(EXIT),
by this way re-switching to the local timer, and then re-enabling the
local interrupt which leads to the interrupt handler.
There are some more informations in the wiki page [1].
-- Daniel
[1] https://wiki.linaro.org/WorkingGroups/PowerManagement/Doc/WakeUpSources
--
<http://www.linaro.org/> Linaro.org â Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/