mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
cpuidle: Add support for Always Running APIC timer, CPUID_0x6_EAX_Bit2.
This bit means the APIC timer continues to run even when CPU is in deep C-states. The advantage is that we can use LAPIC timer on these CPUs always, and there is no need for "slow to read and program" external timers (HPET/PIT) and the timer broadcast logic and related code in C-state entry and exit. Refer to the latest Intel SDM Vol 2A (http://www.intel.com/products/processor/manuals/index.htm) Signed-off-by: Wei Gang <gang.wei@intel.com>
This commit is contained in:
1 parent
cebd2137ea
commit
ede78f509c
4 files changed
+12
-3
No files matched your search
@@ -51,6 +51,7 @@
|
||||
|
||||
/*#define DEBUG_PM_CX*/
|
||||
|
||||
static void lapic_timer_nop(void) { }
|
||||
static void (*lapic_timer_off)(void);
|
||||
static void (*lapic_timer_on)(void);
|
||||
|
||||
@@ -538,8 +539,12 @@ static int check_cx(struct acpi_processor_power *power, xen_processor_cx_t *cx)
|
||||
if ( local_apic_timer_c2_ok )
|
||||
break;
|
||||
case ACPI_STATE_C3:
|
||||
/* We must be able to use HPET in place of LAPIC timers. */
|
||||
if ( hpet_broadcast_is_available() )
|
||||
if ( boot_cpu_has(X86_FEATURE_ARAT) )
|
||||
{
|
||||
lapic_timer_off = lapic_timer_nop;
|
||||
lapic_timer_on = lapic_timer_nop;
|
||||
}
|
||||
else if ( hpet_broadcast_is_available() )
|
||||
{
|
||||
lapic_timer_off = hpet_broadcast_enter;
|
||||
lapic_timer_on = hpet_broadcast_exit;
|
||||
|
||||
@@ -222,6 +222,9 @@ static void __devinit init_intel(struct cpuinfo_x86 *c)
|
||||
set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability);
|
||||
set_bit(X86_FEATURE_NOSTOP_TSC, c->x86_capability);
|
||||
}
|
||||
if ((c->cpuid_level >= 0x00000006) &&
|
||||
(cpuid_eax(0x00000006) & (1u<<2)))
|
||||
set_bit(X86_FEATURE_ARAT, c->x86_capability);
|
||||
|
||||
start_vmx();
|
||||
}
|
||||
|
||||
+1
-1
@@ -1274,7 +1274,7 @@ static int disable_pit_irq(void)
|
||||
* XXX dom0 may rely on RTC interrupt delivery, so only enable
|
||||
* hpet_broadcast if FSB mode available or if force_hpet_broadcast.
|
||||
*/
|
||||
if ( xen_cpuidle )
|
||||
if ( xen_cpuidle && !boot_cpu_has(X86_FEATURE_ARAT) )
|
||||
{
|
||||
hpet_broadcast_init();
|
||||
if ( !hpet_broadcast_is_available() )
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
#define X86_FEATURE_P4 (3*32+ 7) /* P4 */
|
||||
#define X86_FEATURE_CONSTANT_TSC (3*32+ 8) /* TSC ticks at a constant rate */
|
||||
#define X86_FEATURE_NOSTOP_TSC (3*32+ 9) /* TSC does not stop in C states */
|
||||
#define X86_FEATURE_ARAT (3*32+ 10) /* Always running APIC timer */
|
||||
|
||||
/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
|
||||
#define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */
|
||||
|
||||