Skip to content

Commit

Permalink
cpuidle: makes AMD C1E work in acpi_idle
Browse files Browse the repository at this point in the history
When AMD C1E is enabled, local APIC timer will stop even in C1.
This patch uses broadcast IPI to replace local APIC timer in C1.

http://bugzilla.kernel.org/show_bug.cgi?id=13233

[ impact: avoid boot hang in AMD CPU with C1E enabled ]

Tested-by: Dmitry Lyzhyn <thisistempbox@yahoo.com>
Signed-off-by: Shaohua Li <shaohua.li@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
  • Loading branch information
Shaohua Li authored and Len Brown committed May 27, 2009
1 parent cd86a53 commit 87ad57b
Showing 1 changed file with 6 additions and 0 deletions.
6 changes: 6 additions & 0 deletions drivers/acpi/processor_idle.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,9 @@ static void acpi_timer_check_state(int state, struct acpi_processor *pr,
if (cpu_has(&cpu_data(pr->id), X86_FEATURE_ARAT))
return;

if (boot_cpu_has(X86_FEATURE_AMDC1E))
type = ACPI_STATE_C1;

/*
* Check, if one of the previous states already marked the lapic
* unstable
Expand Down Expand Up @@ -611,6 +614,7 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
switch (cx->type) {
case ACPI_STATE_C1:
cx->valid = 1;
acpi_timer_check_state(i, pr, cx);
break;

case ACPI_STATE_C2:
Expand Down Expand Up @@ -835,13 +839,15 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev,
return 0;
}

acpi_state_timer_broadcast(pr, cx, 1);
kt1 = ktime_get_real();
acpi_idle_do_entry(cx);
kt2 = ktime_get_real();
idle_time = ktime_to_us(ktime_sub(kt2, kt1));

local_irq_enable();
cx->usage++;
acpi_state_timer_broadcast(pr, cx, 0);

return idle_time;
}
Expand Down

0 comments on commit 87ad57b

Please sign in to comment.