bool
default X86_64
++ config ARCH_HAS_CPU_RELAX
++ def_bool y
++
+ config HAVE_SETUP_PER_CPU_AREA
+ def_bool X86_64
+ select HAVE_KVM
+ config ARCH_HIBERNATION_POSSIBLE
+ def_bool y
+ depends on !SMP || !X86_VOYAGER
+ config ARCH_SUSPEND_POSSIBLE
+ def_bool y
+ depends on !X86_VOYAGER
config ZONE_DMA32
bool
return PM_TIMER_TICKS_TO_US((0xFFFFFFFF - t1) + t2);
}
++ /*
++ * Callers should disable interrupts before the call and enable
++ * interrupts after return.
++ */
+ static void acpi_safe_halt(void)
+ {
+ current_thread_info()->status &= ~TS_POLLING;
+ /*
+ * TS_POLLING-cleared state must be visible before we
+ * test NEED_RESCHED:
+ */
+ smp_mb();
+ if (!need_resched())
+ safe_halt();
+ current_thread_info()->status |= TS_POLLING;
+ }
+
#ifndef CONFIG_CPU_IDLE
static void
if (pr->flags.bm_check)
acpi_idle_update_bm_rld(pr, cx);
- acpi_safe_halt();
- current_thread_info()->status &= ~TS_POLLING;
- /*
- * TS_POLLING-cleared state must be visible before we test
- * NEED_RESCHED:
- */
- smp_mb();
- if (!need_resched())
- safe_halt();
- current_thread_info()->status |= TS_POLLING;
++ t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
++ acpi_idle_do_entry(cx);
++ t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
++ local_irq_enable();
cx->usage++;
-- return 0;
++ return ticks_elapsed_in_us(t1, t2);
}
/**
if (acpi_idle_suspend)
return(acpi_idle_enter_c1(dev, state));
+ if (acpi_idle_bm_check()) {
+ if (dev->safe_state) {
+ return dev->safe_state->enter(dev, dev->safe_state);
+ } else {
++ local_irq_disable();
+ acpi_safe_halt();
++ local_irq_enable();
+ return 0;
+ }
+ }
+
local_irq_disable();
current_thread_info()->status &= ~TS_POLLING;
/*
switch (cx->type) {
case ACPI_STATE_C1:
state->flags |= CPUIDLE_FLAG_SHALLOW;
++ state->flags |= CPUIDLE_FLAG_TIME_VALID;
state->enter = acpi_idle_enter_c1;
+ dev->safe_state = state;
break;
case ACPI_STATE_C2: